grep/sed、正则表达式略解

1、grep

 grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数 #加上c之后,命令返回次数(数字)
-i :忽略大小写
-n :输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!
//在当前目录搜索带'test'行的文件
grep ‘test’ *   
//在当前目录及其子目录下搜索'test'行的文件
grep -r ‘test’ * 
// 在当前目录及其子目录下搜索'test'行的文件,但是不显示匹配的行,只显示匹配的文件
grep -l -r ‘test’ *    
. (小数点):代表『一定有一个任意字节』。
* (星号):代表『重复前一个字符, 0 到无穷多次』。
^ :在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!
$ :代表定位在行尾。

故:

 grep -n '^$' test.txt #代表找出空白行

……

2、sed命令
与grep一样,sed也支持特殊元字符,来进行模式查找、替换。不同的是,sed使用的正则表达式是括在斜杠线”/”之间的模式。
默认情况下,sed把输入行打印在屏幕上,选项-n用于取消默认的打印操作。

替换操作:s命令

-n选项和-p命令一起使用表示只打印那些发生替换的行:

root@ubuntu:~# ifconfig |sed -n 's/inet/hello/p' 
          hello addr:192.168.2.195  Bcast:192.168.2.255  Mask:255.255.255.0
          hello6 addr: fe80::20c:29ff:fe66:996/64 Scope:Link
          hello addr:127.0.0.1  Mask:255.0.0.0
          hello6 addr: ::1/128 Scope:Host
root@ubuntu:~# 

替换inet为hello。其中后面的‘p’命令一定要加上,否则无打印输出。

延伸一下:
使用grep命令定位到行,然后使用sed命令进行替换修改。

//定位到带有“inet”的行
root@ubuntu:~# ifconfig |grep 'inet'                                                 
          inet addr:192.168.2.195  Bcast:192.168.2.255  Mask:255.255.255.0                               
          inet6 addr: fe80::20c:29ff:fe66:996/64 Scope:Link                                              
          inet addr:127.0.0.1  Mask:255.0.0.0                                                            
          inet6 addr: ::1/128 Scope:Host  
//定位到带有“inet”的行 |  把“inet.addr:” 替换为“ ”(空格)                                                          
root@ubuntu:~# ifconfig |grep 'inet'|sed -n 's/inet.addr:/ /p'
           192.168.2.195  Bcast:192.168.2.255  Mask:255.255.255.0
           127.0.0.1  Mask:255.0.0.0
//定位到带有“inet”的行 | 把“inet.addr:” 替换为“ ”(空格)| 把“ ”(空格)替换为空
//(不能直接把  “inet.addr:” 替换为空)(此处不知为什么)        
root@ubuntu:~# ifconfig |grep 'inet'|sed -n 's/inet.addr:/ /p'|sed -n 's/  *//p'     
192.168.2.195  Bcast:192.168.2.255  Mask:255.255.255.0
127.0.0.1  Mask:255.0.0.0
//定位到带有“inet”的行 | 把“inet.addr:” 替换为“ ”(空格)| 把“ ”(空格)替换为空 | 替换“大写字母开头到一行结束”的内容为“ ”(空格)
root@ubuntu:~# ifconfig |grep 'inet'|sed -n 's/inet.addr:/ /p'|sed -n 's/  *//p'|sed 's/[B-M]..*//'
192.168.2.195  
127.0.0.1  
root@ubuntu:~# 
//添加的最后一条中,没有添加p命令。如果添加的话,会打印两次ip地址。
root@ubuntu:~# ifconfig |grep 'inet'|sed -n 's/inet.addr:/ /p'|sed -n 's/  *//p'|sed 's/[B-M]..*//p'
192.168.2.195  
192.168.2.195  
127.0.0.1  
127.0.0.1  
root@ubuntu:~#

这种靠替换的方法获取ip很麻烦,还有其他简便获取ip的方法。

删除操作:d命令

//删除空白行
ifconfig | sed '/^$/d'
//删除第2行
ifconfig | sed '2d' 
//删除文件的第2行到末尾所有行
ifconfig | sed '2,$d' 
//删除最后一行
ifconfig | sed '$d'
//删除最后两行
ifconfig | sed 'N;$!P;$!D;$d'
//删除最后三行
ifconfig | sed -n '1{N;N;};:a;N;P;D;t a'
//删除最后四行  //其他依次类推,增加N的数量就行。
ifconfig | sed -n '1{N;N;N;};:a;N;P;D;t a' 

sed命令在文件某行前后添加内容的用法

//向test.c文件的nameserver 127.0.0.1行之后添加:nameserver 8.8.8.8行
sed -i '/nameserver 127.0.0.1/a\nameserver 8.8.8.8' test.c
//向test.c文件的nameserver 127.0.0.1行之前添加:nameserver 192.168.2.1行
sed -i '/nameserver 127.0.0.1/i\nameserver 192.168.2.1' test.c

测试过程:

root@ubuntu:~/adams# cat test.c 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
root@ubuntu:~/adams# sed -i '/nameserver 127.0.0.1/a\nameserver 8.8.8.8' test.c
root@ubuntu:~/adams# cat test.c                                                      
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
nameserver 8.8.8.8
root@ubuntu:~/adams# sed -i '/nameserver 127.0.0.1/i\nameserver 192.168.2.1' test.c
root@ubuntu:~/adams# cat test.c                                                      
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.2.1
nameserver 127.0.0.1
nameserver 8.8.8.8
root@ubuntu:~/adams# 

参考链接:
http://www.cnblogs.com/edwardlost/archive/2010/09/17/1829145.html
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856896.html
http://man.linuxde.net/sed

猜你喜欢

转载自blog.csdn.net/weixin_38184741/article/details/80117905