linux 三剑客老大-awk

1,取指定行的指定列

[root@90-99 oldboy]# cat aa.txt
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
11 k
12 l
13 m
14 n

[root@90-99 oldboy]# awk '{if(NR>=5 && NR<=10) print $1}' aa.txt#me:NR代表行号,&&代表并且
5
6
7
8
9
10

也可以使用sed来去行数,awk取列,命令如下:

sed  -n '5,10p' aa.txt  | awk '{print $1}'

[root@90-99 oldboy]# awk '{if(NR>=5 && NR<=10) print $2}' aa.txt  
e
f
g
h
i
j

2,巧用多个字段作为分隔符

[root@90-99 wuxy]# stat test.sh |sed -n '4p'
Access: (0664/-rw-rw-r--)  Uid: (  504/    wuxy)   Gid: (  504/    wuxy)

[root@90-99 wuxy]# stat test.sh |sed -n '4p'|awk -F "[(/]" '{print $1}'
Access:
[root@90-99 wuxy]# stat test.sh |sed -n '4p'|awk -F "[(/]" '{print $2}'
0664
[root@90-99 wuxy]# stat test.sh |sed -n '4p'|awk -F "[(/]" '{print $3}'
-rw-rw-r--)  Uid:
[root@90-99 wuxy]# stat test.sh |sed -n '4p'|awk -F "[(/]" '{print $4}'
  504

备注:

-F "[(/]" 代表以 ( 或者 / 作为分隔符!!  

在seq 中用-s指定分隔符。eg:

[wuxy@robin shell]$ seq  -s "----" 5
1----2----3----4----5

3,NR代表行号,NF代表列数

取文件的最后一列

cat aa.txt | awk '{print $NF}'

4,awk过滤以某个字符开头的 行

[root@robin tmp]# ls -ld *
-rw-r--r--. 1 root root    0 Mar  8 14:42 a
lrwxrwxrwx. 1 root root   16 Mar  8 14:43 b -> /home/wuxy/tmp/a
drwxr-xr-x. 3 root root 4096 Mar  8 17:57 c
drwxr-xr-x. 2 root root 4096 Mar  8 17:58 e
[root@robin tmp]# ls -ld * | awk /^l/
lrwxrwxrwx. 1 root root   16 Mar  8 14:43 b -> /home/wuxy/tmp/a

[root@robin tmp]# ls -ld * | grep '^l'
lrwxrwxrwx. 1 root root   16 Mar  8 14:43 b -> /home/wuxy/tmp/a

[root@robin tmp]# ls -ld * |sed -n '/^l/p'
lrwxrwxrwx. 1 root root   16 Mar  8 14:43 b -> /home/wuxy/tmp/a

[root@robin robin]# ifconfig eth1 | awk '/inet addr/'   ###过滤以inet addr 开头的行
          inet addr:192.168.90.96  Bcast:192.168.90.255  Mask:255.255.255.0

[root@robin robin]# ifconfig eth1 | awk '/inet addr/ {print $3}'
Bcast:192.168.90.255


[root@robin robin]# ifconfig eth1 | sed -n '/inet addr/p' ###sed也可以完成
          inet addr:192.168.90.96  Bcast:192.168.90.255  Mask:255.255.255.0

5,取第二列到最后一列

[root@robin zabbix]# cat agent-info | grep MAC
MAC:00:21:F6:00:00:3B

需要MAC地址:00:21:F6:00:00:3B

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" '{for(i=2;i<=NF;i++) print $i}'
00
21
F6
00
00
3B

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" '{for(i=2;i<=NF;i++) print $i":"}'
00:
21:
F6:
00:
00:
3B:

##print 默认打印完后的分隔符是换行符,可以用ORS=":" 来修改行分隔符,即把换行符换成冒号分隔

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i}'
00:21:F6:00:00:3B:[root@robin zabbix]# 

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i}' | wc -l
0

##没有换行符时,不是一行,改进如下:

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i;printf "\n"}'                  
00:21:F6:00:00:3B:

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) printf $i;printf "\n"}'  
0021F600003B

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i;print "\n"}'  
00:21:F6:00:00:3B:

:[root@robin zabbix]#

注意循环完后用的时printf打印一个换行符 "\n",而不是print

最终命令为:

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i;printf "\n"}'  | sed 's#.$##g'

00:21:F6:00:00:3B

##print打印完成后默认换行,printf打印完成后默认不换行,需指定printf "\n",同时都可以用引号""指定输出的连接符

6,awk取指定行

[root@robin ~]# ifconfig eth1 | awk "NR==2" | cut -c 21-33              
192.168.90.96

[root@robin ~]# ifconfig eth1 | awk -F"[ :]+" 'NR==2 {print $4}'
192.168.90.96

7,awk变量

变量名     含义

ARGC       命令行变元个数

ARGV       命令行变元数组

FILENAME   当前输入文件名

FNR        当前文件的记录号

FS         输入域分隔符,默认为一个空格

RS         输入记录分隔符

NF         表示当前行记录域或列的个数

NR         表示当前行的记录号或行号

OFS        输出域分隔符

ORS        输出记录分隔符

$1         第一列,$2第二列,$0整行

$NF        最后一列

$(NF-1)    倒数第二

你可能感兴趣的:(awk)