凝望长空 发表于 2011-12-28 20:47

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


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










nl的作用:

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

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

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

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

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

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


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

注意:以下结果我只是截取了一部分# cat /etc/man.config | grep 'MAN'
# when MANPATH contains an empty substring), to find out where the cat
# MANBIN                pathname
# MANPATH               manpath_element
# MANPATH_MAP         path_element    manpath_element
# MANBIN                /usr/local/bin/man
# Every automatically generated MANPATH includes these fields
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
MANPATH /usr/local/share/man
MANPATH /usr/X11R6/man


# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g'












MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
MANPATH /usr/local/share/man
MANPATH /usr/X11R6/man


# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | sed '/^$/d'


MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
MANPATH /usr/local/share/man
MANPATH /usr/X11R6/man小节四:直接修改文件内容(危险动作)

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

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

由于$代表的是最后一行,而a的动作是新增,因此就在该文件最后新增内容!# sed -i '$a # This is a test' regular_express.txt
# cat regular_express.txt
This is zhuying!
# This is a test3. sed -i '$a \\' regular_express.txt 【在最后一行新增一空行】# sed '$a \\' regular_express.txt
This is zhuying!
# This is a test
#This is a joke,are you kidding?

#切忌:不可使用\n,这个在双引号中生效,但貌似在sed中不行哦,下面我们来看一下!# sed '$a \n' regular_express.txt
This is zhuying!
# This is a test
#This is a joke,are you kidding?
n
# sed '$a "\n"' regular_express.txt
This is zhuying!
# This is a test
#This is a joke,are you kidding?
"
"
#

第一夫人 发表于 2011-12-28 20:47

谢谢分享

Shell_HAT 发表于 2011-12-28 23:19

一般来说,sed自己就行啦,不必结合nl:mrgreen:
页: [1]
查看完整版本: @正则表达式---nl和sed的结合@