今天看到一个小script是利用sed的RE现实IP的内容如下: #!/bin/sed -f /^[^ ]/!d N s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/ 执行的时候打/sbin/ifconfig | ./scripts 就能只显示出device和IP。
问题是我看了一下发现不是看的很懂,不知道有没有RE熟悉的高手给我指教一二啊感激不尽啊,我说一下我愚顿的理解: /^[^ ]/!d --意思是不是行开头为非空的不删除,就是删除行开头为空的。 N --不理解啊,高手指教了。 s/^\([^ ]*\).* --我好像知道\ (\)包括的内容对应后面的\1这里是不是表示开头为非空的部分 \n --这个什么意思啊?不理解了难道就是回车空行??? .*addr:\([^ ]*\).*--我认为这个是表示addr有addr:后面的直到非空的东西都包括在\(\)里面与\2对应,但是后面又有的.*是什么意思啊 /\1\2/ --这个东西我知道就是按找前面排的\1\2替换现实并且是非(\g的)全部替换。
我是这样理解的不知道有没有错,三行怎么窜起来理解乃,我认为第一行没什么用啊但是我去除第一行就起不到作用。希望高手出来指点一下啊大家也顺便讨论下啊我认为RE这个东西蛮有意思的啊^_^ 附:本来ifconfig结果为: eth0 Link encap:Ethernet HWaddr 00:02:B3:4F:F6:FE inet addr:X.X.X.X Bcast:61.129.74.255.....
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0.....
执行/sbin/ifconfig | ./scripts后的结果为 [root@GK_SH tmp]# ifconfig | ./test eth0 X.X.X.X lo 127.0.0.1
------------------------------------------------------ 解答:
作者:Chuai 第一行: /^[^ ]/!d 需要注意方括号中有一个空格,是用来将ifconfig输出中所有以空格开始的行删除使用的,这样就保留了所有非空格开始的行,也就是设备名称所在的行,如: eth0 Link...........
第二行: N 在sed命令中是做如下解释的: Read/Append the next line of input into patten space 也就是当/^[^ ]/!d读到第一个非空格开头的行后,读下一行,而在下一行正好是地址所在的行
第三行: s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/ 把它分解一下可以变成三部分: 第一部分是s/,用于替换的意思 第二部分是^\([^ ]*\).*\n.*addr:\([^ ]*\).* 第三部分是\1 \2 其中第三部分的\1是指第二部分的[^ ]* 这部分内容,由于()有特殊性,所以用\转义了,实际内容就是[^ ]*,而这一部分和第一步的那个类似,不过是选取了非空格开头的第一个单词,也就是网卡的名字,如eth0,\n是指回车,接下来的addr:很容易理解了,就是选取地址然后打印出来喽
另外,第三行完全是为后面两行打基础的,将过滤出来的两行传递给了第三行进行继续处理。 |