sed小技巧

来源:互联网 发布:生意参谋数据下载 编辑:程序博客网 时间:2024/06/07 05:08

刚刚看老男孩的博客关于sed的讲解,很清晰。我整理记录在案。

先热热身,取出good字符串。

# echo I am good student. | sed 's@^.*am\([a-z].*\)stu.*$@\1@g'

good

 

1.分隔符#,可以使用/,%,@等替代。

2.sed命令

s 查找并替换,将一个字符串替换成另一个

g 与s联合使用时,表示对当前行全局匹配替换

p 打印匹配行

3.sed选项

-e 允许多项编辑

-n 取消默认输出

4.正则表达式:

^word //以word开头的行

Word$ //以Word结尾的行

. //匹配一个字符

*//匹配0个或多个字符

         grep -n 'ess*' test.txt

找出含有(es),(ess),(esss)等的字符串,注意,因为(*)可以是0个,所以es也是符合搜索字符串。另外,因为(*)为重复“前一个字符”的符号,因此,在(*)之前必须要紧接一个重复字符。任意字符则为(.*)

.* //匹配所有字符

5.sed中\( \)和\1的功能:

sed的\( \)功能可以记住正则表达式的一部分,其中,\1为第一个记住的模式即第一个小括号中的匹配内容,\2第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。

 

实例说明:

# echo I am good student. | sed 's@^.*am\([a-z].*\)stu.*$@\1@g'

 

a)^.*am□ //这句的意思是以任意字符开头到am□为止,匹配文件中的“I am□”字符串

b)\([a-z].*\)□ //这句的外壳就是括号\(\),里面的[a-z]表示匹配26个字母的任何一个,[a-z].* 合起来就是匹配任意多个字符,本题来说就是匹配good字符串,由于good字符串是需要保留的,因此用括号括起来匹配,后面通过\1来取good字符串。

c)□stu.*$ //表示以空格tea起始任意字符结尾,实际就是匹配good字符串后,紧接着的字符串“□student.”。

d)后面被替换的内容中的\1就是取前面的括号里的内容了,也就是我们要的good字符串。

 

取字符串的技巧

取出stat file显示的权限数字

         法1.# stat file | sed -n '4p' | sed 's@^.*(0@@g' | sed 's@/-.*@@g'

             644                                    删除前面半段               删除后面半段

         法2. # stat file | sed -n 's@^.*(0\([0-7].*\)\/-.*$@\1@gp'

             644                      直接匹配

    解释:

      实例给出了正则表达式中小括号以及在sed中寄存器的用法,小括号在正则表达式中用来标记前面被匹配模式命中的字符串,在sed中,可以使用\1,\2,\3,以此类推,直到\9来保存被前面的给中匹配模式命中的字符串,最多可以标记9个,也就是可以使用9个寄存器。

stat file | sed -n 's#^.*(0\([0-7].*\)\/-.*$#\1#gp'

^ 以什么字符开头

. 任意一个字符,这任意一个字符的含义有两层:1.字符的数量只有一个 2.字符包含各种可打印字符,即ASCII码集内的字符

* 重复前面的字符0次或者多次

^.*的含义就是以任意字符开头并后面重复了任意字符的字符序列

(0 就是匹配stat file这个命令的结果中的第二行的第一个(0这个字符串

Access: (0644/-rw-r--r--) Uid: (   0/   root)   Gid: (   0/   root)

\([0-7].*\)

\(\) 在正则表达式中用来保存被匹配模式命中的字符串,并将它保存到1号寄存器里面,可以使用\1来引用它。

可以看出来,针对本题,匹配了644这个字符序列。

\/-.*$

$ 正则表达式中用来表示行的结尾

就是匹配形如 字符序列中含有/-并紧接着任意字符序列的结尾

#\1#

这个表示的是,把前面的字符串用\1取代,这里\1就是644

 

-n、p选项的作用

sed -n 取消对匹配模式命中的字符串的打印。

在sed的模式中使用p命令表示,打印显示缓冲区(Linux的sed中使用的一个用来显示屏幕内容的缓冲区)中的内容。

把 -n 和p结合使用,能指定要打印的内容。

p是打印符合匹配模式的输入行,模式就是要打印的,加了p,就要打印两次。

-n是取消默认打印。

那么,-n和p联合使用,就是只打印符合匹配模式的内容一次。

正是因为这两个参数,就使得stat file的输出内容的其他行不被打印出来,加上上面说的正则表达式的作用,就只显示644这个内容。

 

练习

Sed取出ip地址

# ifconfig eth0 | grep "inet[^6]" | sed -n 's#^.*:\([0-9].*\) *B.*$#\1#gp' | sed 's#\s*$##g'

Sed取出mac地址

# ifconfig eth0 | grep "Link[^6]" | sed -n 's@^.* \([0-9].*\)@\1@gp'

Awk取出ip地址

# ifconfig eth0 | awk -F'[ :]+' 'NR==2{print $4}'

Awk取出mac地址

# ifconfig eth0 | awk -F' ' 'NR==1{print $5}'
原创粉丝点击