sed小技巧一 字符串提取
(1)取出 good 字符
2.sed命令
s 查找并替换,将一个字符串替换成另一个
g 与s联合使用时,表示对当前行全局匹配替换
p 打印匹配行
# echo I am good student. | sed 's@^.*am \([a-z].*\) stu.*$@\1@g
3.sed选项
-e 允许多项编辑
-n 取消默认输出
4.正则表达式:
^word //以word开头的行
Word$ //以Word结尾的行
. //匹配一个字符
*//匹配0个或多个字符
grep -n 'ess*' test.txt
找出含有(es),(ess),(esss)等的字符串,注意,因为(*)可以是0个,所以es也是符合搜索字符串。另外,因为(*)为重复“前一个字符”的符号,因此,在(*)之前必须要紧接一个重复字符。任意字符则为(.*)
.* //匹配所有字符
实例说明:
# 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'
^.*: //匹配从行首开始到:冒号结束的任意长度字符串
*B.*$ //匹配从B开始到行尾的字符串
\([0-9]\) //匹配位于上述两项之间的并且符合正则表达式[0-9]的字符串(数字0-9)
\1 引用\([0-9]\) 匹配成功的字符串
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}'