一些例子。


1、显示gopher帐号所在行至最后一行。

awk '/^gopher/{row=NR;while(getline < "passwd" ){++i;FS=":";if(i>=row){print $0}}}' passwd

getline < "filename" 若读取成功,则返回非0,当读文件完后,会返回0。

 awk -F: 'NR==FNR{if($1 ~ /^gopher/){row=NR};next}{if (FNR>=row){print $0}}' passwd passwd

用NR==FNR方法。

 awk '/^gopher/{p=1}p' passwd

awk变量若是没有赋值,那么他的初始为0或空。另外1默认是1{print}

sed -n '/^gopher/,$p' passwd 

sed  '/^gopher/,$ !d' passwd


2、提取网卡名称、mac地址、ip地址用一行显示

[root@localhost awk]# cat k
eth0      Link encap:Ethernet  HWaddr 00:50:56:8A:1E:24  
          inet addr:10.16.66.106  Bcast:10.16.66.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe8a:1e24/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19838444 errors:0 dropped:0 overruns:0 frame:0
          TX packets:446941 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1630611345 (1.5 GiB)  TX bytes:65236241 (62.2 MiB)
          Base address:0x2000 Memory:d1020000-d1040000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:7319 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7319 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3808487 (3.6 MiB)  TX bytes:3808487 (3.6 MiB)

eth1      Link encap:Ethernet  HWaddr 00:50:56:8A:1E:24  
          inet addr:172.16.66.106  Bcast:10.16.66.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe8a:1e24/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19838444 errors:0 dropped:0 overruns:0 frame:0
          TX packets:446941 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1630611345 (1.5 GiB)  TX bytes:65236241 (62.2 MiB)
          Base address:0x2000 Memory:d1020000-d1040000
[root@localhost awk]# sed -r -n '/^eth/{s/(eth[0-9]).*HWaddr (.*)/\1 \2/;h;n;s/.*inet addr:(.*)Bcast.*/\1/;H;x;s/\n//p}' k

eth0 00:50:56:8A:1E:24  10.16.66.106  
eth1 00:50:56:8A:1E:24  172.16.66.106  

 awk '/^eth/{x= $1" "$(NF);i=NR}{if (NR == i+1){x= x " "gensub(/.*addr:(.*)Bcast.*/,"\\1","g",$0);print x;x=""}}' k
 
eth0 00:50:56:8A:1E:24 10.16.66.106  
eth1 00:50:56:8A:1E:24 172.16.66.106


3、sub、gsub、match、gensub使用


sub使用:

    sub(/正则/,"替换匹配到的字符串","要处理的字符串,默认是$0") 

    返回值:指替换正则的个数

    sub的结果会修改原字符串,比如$0

    只能替换第一个匹配到的值。


例:

[root@localhost awk]# cat a
1 a b
2 c d
3 huang xuewen
4 xx huang aa huang
[root@localhost awk]# 
[root@localhost awk]# awk '{a=sub(/huang/,"ooo",$0);print a"==="$0}' a
0===1 a b
0===2 c d
1===3 ooo xuewen
1===4 xx ooo aa huang
[root@localhost awk]#



gsub使用:

    gsub与sub用法基本一样,sub只替换第一个匹配到的值,gsub替换所有匹配到的值。

[root@localhost awk]# cat a
1 a b
2 c d
3 huang xuewen
4 xx huang aa huang
5 xx huang aa huang xabc huang a
[root@localhost awk]# awk '{a=gsub(/huang/,"ooo",$0);print a"==="$0}' a
0===1 a b
0===2 c d
1===3 ooo xuewen
2===4 xx ooo aa ooo
3===5 xx ooo aa ooo xabc ooo a
[root@localhost awk]#


match使用:

    match("原字符串","正则表达式",array)

    返回值:若匹配到,则会返回匹配的位置,若是没有匹配到,则返回0

    可以分组表示,若正则表达式中使用(引起的内容),那么会存放到array数据中。可以用array[1]表示第一个匹配到的分组内容。


[root@localhost awk]# cat k1
inet addr:10.16.66.106  Bcast:10.16.66.255  Mask:255.255.255.0
inet addr:172.16.66.168  Bcast:172.16.66.255  Mask:255.255.255.0

[root@localhost awk]# awk '{if(match($0,"[^:]*:([^ ]*).*Bcast:([^ ]*).*",a))print a[1],a[2] }' k1

10.16.66.106 10.16.66.255
172.16.66.168 172.16.66.255


gensub使用:

    gensub("正则表达式","要替换表达式的字符串","1或g","处理的字符串")

     1表示只替换一个,g替换所有

    返回值

         1、使用普通的值替换正则表达式,返回的是替换后的值。

         2、若是使用\\1 这个表示返回的值是正则表达式中(引起的内容),\\2表示第二个


下面的正则乱写的。

[root@localhost awk]# cat k1
inet addr:10.16.66.106  Bcast:10.16.66.255  Mask:255.255.255.0
inet addr:172.16.66.168  Bcast:172.16.66.255  Mask:255.255.255.0

[root@localhost awk]# awk '{s=gensub("[^:]*:([^ ]*).*","hxw",1,$0);print s}' k1
hxw
hxw
[root@localhost awk]# awk '{s=gensub("[^:]*:([^ ]*).*","\\1",1,$0);print s}' k1

10.16.66.106
172.16.66.168