专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>shell基础篇>

正则表示法解惑(具体例子请教高手)

百度收藏 QQ搜藏

今天看到一个小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:很容易理解了,就是选取地址然后打印出来喽

另外,第三行完全是为后面两行打基础的,将过滤出来的两行传递给了第三行进行继续处理。

上一篇:自己常用的正则表达式 下一篇:正则迷雾--各种工具之正则表达式语法比较

power by soyo123 2007-2008