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) 倒数第二列