免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1504 | 回复: 2
打印 上一主题 下一主题

@正则表达式---nl和sed的结合@ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-28 20:47 |只看该作者 |倒序浏览

@正则表达式---nl和sed的结合@











nl的作用:

nl - number lines of files打印出文件的内容,并每行前加上行号。

有一点需要注意的就是nl在空行前是不显示行号的~

小节一:以行为单位的新增/删除功能

1. nl /etc/passwd | sed '2,5d'【将/etc/passwd的内容列出并且列印行号,同时,请将第 2~5 行删除】
  1. [root@sor-sys ~]# nl /etc/passwd | sed '2,5d'
  2.       1  root:x:0:0:root:/root:/bin/bash
  3.       6  sync:x:5:0:sync:/sbin:/bin/sync
  4.       7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  5.       8  halt:x:7:0:halt:/sbin:/sbin/halt
  6.       9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  7.      10  news:x:9:13:news:/etc/news:
复制代码
2. nl /etc/passwd | sed '2a drink tea'【在第二行后(亦即是加在第三行)加上『drink tea?』字样!】
  1. [root@sor-sys ~]# nl /etc/passwd | sed '2a drink tea'
  2.       1  root:x:0:0:root:/root:/bin/bash
  3.       2  bin:x:1:1:bin:/bin:/sbin/nologin
  4. drink tea
  5.       3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
  6.       4  adm:x:3:4:adm:/var/adm:/sbin/nologin
  7.       5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  8.       6  sync:x:5:0:sync:/sbin:/bin/sync
  9.       7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  10.       8  halt:x:7:0:halt:/sbin:/sbin/halt
  11.       9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  12.      10  news:x:9:13:news:/etc/news:
复制代码
3. nl /etc/passwd | sed '2a Drink tea or \
drink beer ?'【在第二行后面加入两行字,例如Drink tea or .....与drink beer?】
  1. [root@sor-sys ~]#  nl /etc/passwd | sed '2a Drink tea or \
  2. > drink beer ?'
  3.       1  root:x:0:0:root:/root:/bin/bash
  4.       2  bin:x:1:1:bin:/bin:/sbin/nologin
  5. Drink tea or
  6. drink beer ?
  7.       3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
  8.       4  adm:x:3:4:adm:/var/adm:/sbin/nologin
  9.       5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  10.       6  sync:x:5:0:sync:/sbin:/bin/sync
  11.       7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  12.       8  halt:x:7:0:halt:/sbin:/sbin/halt
  13.       9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  14.      10  news:x:9:13:news:/etc/news:
复制代码
小节二:以行为单位的取代与显示功能

1. nl /etc/passwd | sed '2,5c No 2-5 number'【将第2-5行的内容取代成为No 2-5 number】
  1. [root@sor-sys ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
  2.       1  root:x:0:0:root:/root:/bin/bash
  3. No 2-5 number
  4.       6  sync:x:5:0:sync:/sbin:/bin/sync
  5.       7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  6.       8  halt:x:7:0:halt:/sbin:/sbin/halt
  7.       9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  8.      10  news:x:9:13:news:/etc/news:
复制代码
2. nl /etc/passwd | sed -n '5,7p'【仅列出 /etc/passwd 文件内的第 5-7 行】
  1. [root@sor-sys ~]# nl /etc/passwd | sed -n '5,7p'
  2.       5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  3.       6  sync:x:5:0:sync:/sbin:/bin/sync
  4.       7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
复制代码
小节三:部分数据的搜寻并取代的功能

1. /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'【获取主机ip】
  1. [root@sor-sys ~]# /sbin/ifconfig eth0 | grep 'inet addr'
  2.            inet addr:192.168.55.229  Bcast:192.168.55.255  Mask:255.255.255.0
  3. [root@sor-sys ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
  4. 192.168.55.229  Bcast:192.168.55.255  Mask:255.255.255.0
  5. [root@sor-sys ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
  6. 192.168.55.229  
  7. [root@sor-sys ~]#
复制代码
假如说我们的ip比较多的话,正巧你想要获得eth0,那么我们可以用个比较高级的用法:
  1. [root@sor-sys ~]# ifconfig eth0 | awk -F'[ :]+''NR==2{print $4}'
  2. 192.168.55.229
复制代码
为了方便你观察各部分的内容,我就多打印了一些信息:
  1. [root@sor-sys ~]# ifconfig eth0 | awk -F'[ :]+' 'NR==2{print $1}'


  2. [root@sor-sys ~]# ifconfig eth0 | awk -F'[ :]+' 'NR==2{print $2}'
  3. inet
  4. [root@sor-sys ~]# ifconfig eth0 | awk -F'[ :]+' 'NR==2{print $3}'
  5. addr
  6. [root@sor-sys ~]# ifconfig eth0 | awk -F'[ :]+' 'NR==2{print $5}'
  7. Bcast
复制代码
2. 假设我只要 MAN 存在的那几行数据, 但是含有 # 在内的注解我不想要,而且空白行我也不要!此时该如何处理呢?

注意:以下结果我只是截取了一部分
  1. [root@sor-sys ~]# cat /etc/man.config | grep 'MAN'
  2. # when MANPATH contains an empty substring), to find out where the cat
  3. # MANBIN                pathname
  4. # MANPATH               manpath_element [corresponding_catdir]
  5. # MANPATH_MAP           path_element    manpath_element
  6. # MANBIN                /usr/local/bin/man
  7. # Every automatically generated MANPATH includes these fields
  8. MANPATH /usr/man
  9. MANPATH /usr/share/man
  10. MANPATH /usr/local/man
  11. MANPATH /usr/local/share/man
  12. MANPATH /usr/X11R6/man


  13. [root@sor-sys ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g'












  14. MANPATH /usr/man
  15. MANPATH /usr/share/man
  16. MANPATH /usr/local/man
  17. MANPATH /usr/local/share/man
  18. MANPATH /usr/X11R6/man


  19. [root@sor-sys ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | sed '/^$/d'


  20. MANPATH /usr/man
  21. MANPATH /usr/share/man
  22. MANPATH /usr/local/man
  23. MANPATH /usr/local/share/man
  24. MANPATH /usr/X11R6/man
复制代码
小节四:直接修改文件内容(危险动作)

1. sed -i 's/\.$/\!/g' regular_express.txt【利用sed将regular_express.txt内每一行结尾若为.则换成!】

#上头的-i选项可以让你的sed直接去修改后面接的文件内容而不是由屏幕输出!
#这个范例是用在取代!请您自行 cat 该文件去查阅结果罗!
  1. [root@sor-sys zy]# cat regular_express.txt
  2. This is zhuying.
  3. [root@sor-sys zy]# sed -i 's/\.$/\!/g' regular_express.txt
  4. [root@sor-sys zy]# cat regular_express.txt
  5. This is zhuying!
复制代码
2. sed -i '$a # This is a test' regular_express.txt【利用sed直接在regular_express.txt最后一行加入# This is a test】

由于$代表的是最后一行,而a的动作是新增,因此就在该文件最后新增内容!
  1. [root@sor-sys zy]# sed -i '$a # This is a test' regular_express.txt
  2. [root@sor-sys zy]# cat regular_express.txt
  3. This is zhuying!
  4. # This is a test
复制代码
3. sed -i '$a \\' regular_express.txt 【在最后一行新增一空行】
  1. [root@sor-sys zy]# sed '$a \\' regular_express.txt
  2. This is zhuying!
  3. # This is a test
  4. #This is a joke,are you kidding?

  5. [root@sor-sys zy]#
复制代码
切忌:不可使用\n,这个在双引号中生效,但貌似在sed中不行哦,下面我们来看一下!
  1. [root@sor-sys zy]# sed '$a \n' regular_express.txt
  2. This is zhuying!
  3. # This is a test
  4. #This is a joke,are you kidding?
  5. n
  6. [root@sor-sys zy]# sed '$a "\n"' regular_express.txt
  7. This is zhuying!
  8. # This is a test
  9. #This is a joke,are you kidding?
  10. "
  11. "
  12. [root@sor-sys zy]#
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-28 20:47 |只看该作者
谢谢分享

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2011-12-28 23:19 |只看该作者
一般来说,sed自己就行啦,不必结合nl
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP