AWK 笔记
目录
记录和字段分隔符
RS/ORS(记录分隔符)
RS 是记录分隔符,默认为 \n(换行)。ORS 是输出记录分隔符。
示例文件:
1234 323123
4321 321321
66661234 124213
使用 2 作为记录分隔符:
$ awk 'BEGIN{RS="2"}{print $0}' 7.txt
1
34 3
31
3
43
1 3
13
1
66661
34 1
4
13
修改输出分隔符为 --:
$ awk 'BEGIN{ORS="--"}{print $0}' 7.txt
1234 323123--4321 321321--66661234 124213--
FS/OFS(字段分隔符)
FS 是字段分隔符(列分隔符),默认为制表符。OFS 是输出字段分隔符。
使用 2 作为字段分隔符:
$ awk 'BEGIN{FS="2"}{print $1,$2,$3}' 7.txt
1 34 3 31
43 1 3 13
66661 34 1 4
修改输出字段分隔符为 --:
$ awk 'BEGIN{OFS="--"}{print $1,$2,$3}' 7.txt
1234--323123--
4321--321321--
66661234--124213--
内建变量:NR、FNR、NF
定义
- NR:Number of Record,从 AWK 开始执行后,按照记录分隔符读取的数据次数。在处理多个文件时累加。
- FNR:File Number of Record,处理新文件时从 1 开始计数。
- NF:Number of Field,当前记录被分割的字段数。
示例文件
class1:
zhaoyun 85 87
guanyu 87 88
liubei 90 86
class2:
caocao 92 87 90
guojia 99 96 92
使用 NR(全局行号)
$ awk '{print NR,$0}' class1 class2
1 zhaoyun 85 87
2 guanyu 87 88
3 liubei 90 86
4 caocao 92 87 90
5 guojia 99 96 92
使用 FNR(文件内行号)
$ awk '{print FNR,$0}' class1 class2
1 zhaoyun 85 87
2 guanyu 87 88
3 liubei 90 86
1 caocao 92 87 90
2 guojia 99 96 92
结合 FILENAME 和 NF
$ awk '{print FILENAME,"NR="NR,"FNR="FNR,"$"NF"="$NF}' class1 class2
class1 NR=1 FNR=1 $3=87
class1 NR=2 FNR=2 $3=88
class1 NR=3 FNR=3 $3=86
class2 NR=4 FNR=1 $4=90
class2 NR=5 FNR=2 $4=92
class1 有 3 个字段,class2 有 4 个字段。$NF 获取最后一个字段。
实用命令
复制文件(不覆盖已存在文件)
awk 'BEGIN { cmd="cp -i A/* B/"; print "n" |cmd; }'
获取除第一列外的所有列
awk '{$1="";print}'
查看 TCP 各状态的连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'