awk、grep、sed、cut

一、常规方法

  1. [root@localhost ~]# ifconfig eth0 
  2. eth0      Link encap:Ethernet  HWaddr BC:30:5B:C0:CD:4F   
  3.           inet addr:192.168.7.2  Bcast:192.168.7.255  Mask:255.255.255.0 
  4.           inet6 addr: fe80::be30:5bff:fec0:cd4f/64 Scope:Link 
  5.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
  6.           RX packets:45814755 errors:12 dropped:0 overruns:0 frame:55 
  7.           TX packets:14791104 errors:0 dropped:0 overruns:0 carrier:0 
  8.           collisions:0 txqueuelen:1000  
  9.           RX bytes:4338136769 (4.0 GiB)  TX bytes:2483722504 (2.3 GiB) 
  10.           Interrupt:16  
  11.  
  12. [root@localhost ~]# ifconfig eth0 |grep 'inet add' 
  13.           inet addr:192.168.7.2  Bcast:192.168.7.255  Mask:255.255.255.0 
  14. [root@localhost ~]# ifconfig eth0 |grep 'inet add'|awk -F ":" '{print $2}' 
  15. 192.168.7.2  Bcast 
  16. [root@localhost ~]# ifconfig eth0 |grep 'inet add'|awk -F ":" '{print $2}'|awk '{print $1}' 
  17. 192.168.7.2 
  18. [root@localhost ~]#  

二、通过awk同时使用多个分隔符来实现:

  1. [root@localhost ~]# ifconfig eth0|grep 'inet addr' 
  2.           inet addr:192.168.7.2  Bcast:192.168.7.255  Mask:255.255.255.0 
  3. [root@localhost ~]# ifconfig eth0|grep 'inet addr'|awk -F'[ :]' '{print $13}' 
  4. 192.168.7.2 
  5. [root@localhost ~]# 
  6. 选取包含IP地址行的特殊关键字'inet addr’过滤然后,使用awk以空格和:同时做分隔符,然后取出需要的内容
  7. 最大缺点就是计算$n的时候很费劲,因为inet前面有多个空格,查到$13,真是不容易,如此看来从实现时间上可能还不如第一个方法快呢?

三、通过awk同时使用多个分隔符,然后通过正则匹配多个分隔符的方法来实现:

  1. [root@localhost ~]# ifconfig eth0 |awk NR=2 
  2. eth0      Link encap:Ethernet  HWaddr BC:30:5B:C0:CD:4F   
  3.           inet addr:192.168.7.2  Bcast:192.168.7.255  Mask:255.255.255.0 
  4.           inet6 addr: fe80::be30:5bff:fec0:cd4f/64 Scope:Link 
  5.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
  6.           RX packets:45867518 errors:12 dropped:0 overruns:0 frame:55 
  7.           TX packets:14808564 errors:0 dropped:0 overruns:0 carrier:0 
  8.           collisions:0 txqueuelen:1000  
  9.           RX bytes:4343100002 (4.0 GiB)  TX bytes:2486006118 (2.3 GiB) 
  10.           Interrupt:16  
  11.  
  12. [root@localhost ~]# ifconfig eth0 |awk NR==2 
  13.           inet addr:192.168.7.2  Bcast:192.168.7.255  Mask:255.255.255.0 
  14. [root@localhost ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}' 
  15. 192.168.7.2 
  16. [root@localhost ~]#  

 

提示:本题NR是行号,分隔符+号匹配,[ ]里一个或多个任意一个分隔符,这里就是匹配一个或多个冒号或空格。

1awk -F 后面跟分隔符‘[空格:]+’,其中[空格:]多分隔符写法,意思是以空格或冒号做分隔,后面的"+"号是正则表达式,意思是匹配前面空格或冒号,两者之一的1个或1个以上。

2NR==2sed -n "2p",相当,意思都是选择第几行,例:

[root@oldboy ~]# ifconfig eth0|awk NR==2

         inet addr:192.168.7.2  Bcast:192.168.7.255  Mask:255.255.255.0

3)指定awk -F '[ :]+'分隔符后,不同字符串被分隔的列依次为:

 

         

inet

addr

192.168.7.2

  Bcast:192.168.7.255  Mask:255.255.255.0

第一列

第二列

第三列

第四列

  后面忽略不计。

 

4)整个答案awk部分意思是,通过NR==2取出第二行,然后,通过-F '[-:]+多分隔符正则匹配,然后通过{print $4}打印出第四列 

 

本文出自 “老男孩的linux博客” 博客