linux awk|Linux中Awk常用文本处理命令用法详解

更新时间:2020-11-20    来源:linux    手机版     字体:

【www.bbyears.com--linux】

I. NR,FNR记录当前行

[root@LinuxEA awk]# cat nr1
1 a
2 b
3 c
4 d
5 e
[root@LinuxEA awk]# awk "{print FNR}" nr1
1
2
3
4
5
6
[root@LinuxEA awk]# awk "{print NR}" nr1
1
2
3
4
5
6
[root@LinuxEA awk]# awk "{print "行. = " NR " 数据 = " RNR,$0}" nr1
行. = 1 数据 =  1 a
行. = 2 数据 =  2 b
行. = 3 数据 =  3 c
行. = 4 数据 =  4 d
行. = 5 数据 =  5 e
行. = 6 数据 = 
[root@LinuxEA awk]#
II. AWK引入变量:

[root@LinuxEA awk]# VAR=linuxea
[root@LinuxEA awk]# awk -v var=$VAR "BEGIN{print var}"
linuxea
[root@LinuxEA awk]# awk "BEGIN{print ""$VAR""}"
linuxea
[root@LinuxEA awk]#
III. OFS输出字段分隔符

[root@LinuxEA awk]# echo "linuxea.com linuxea.com linuxea.com" |awk -v OFS="---" "{$1=$1;print $0}"
linuxea.com---linuxea.com---linuxea.com
[root@LinuxEA awk]#

[root@LinuxEA awk]# echo "linuxea.com linuxea.com linuxea.com" |awk -v OFS="---" "{NF++0;print $0}"
linuxea.com---linuxea.com---linuxea.com---
[root@LinuxEA awk]# echo "linuxea.com linuxea.com linuxea.com" |awk -v OFS="---" "{NF+=0;print $0}"
linuxea.com---linuxea.com---linuxea.com
[root@LinuxEA awk]#
IV. awk实现点分十进制的ip地址转换数字格式

[root@LinuxEA awk]# echo 8.8.8.8 |awk -F. "{n=0;for(i=1;i<=NF;i++){n*=256;n+=$i}print n}"
134744072
[root@LinuxEA awk]#
[root@LinuxEA awk]# echo 8.8.8.8|awk -F. "{printf "%d\n", ($1*(2^24))+($2*(2^16))+($3*(2^8))+$4}"
134744072
[root@LinuxEA awk]#
[root@LinuxEA awk]# ping 134744072
PING 134744072 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=66.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=76.9 ms
[root@LinuxEA awk]# echo 00001000.00001000.00001000.00001000|awk -F. "function bin2dec(a,b,i,c){b=length(a);c=0;for(i=1;i<=b;i++){c+=c;if(substr(a,i,1)=="1")c++}return c}{for(j=1;j<=NF;j++)printf("%d%s",bin2dec($j),j!=NF?".":"\n")}"
8.8.8.8
[root@LinuxEA awk]#
V. 选择性打印

VI. 取其前一行

源文件:

[root@LinuxEA awk]# cat nr1
1 a
2 b
3 c
4 d
5 e
当pattern等于5时,打印前一行

[root@LinuxEA awk]# awk "!/5/{a=$0}/5/{print a}" nr1
4 d
[root@LinuxEA awk]# awk "/5/{print i};i=$0{}"
4 d
如果取前2行则借助一下属组,以前两行为例

[root@LinuxEA awk]# awk "{a[NR]=$0}/5/{p=NR}END{for(i=p-2;i 3 c

4 d
VII. 如果取其后两行

已知从3行开始,从3到5行内容

[root@LinuxEA awk]# awk "/3/{p=1;a=NR}p&&NR-x<=5&&NR-x>0" nr1
3 c
4 d
5 e
[root@LinuxEA awk]#
VIII. 取出现匹配次数

源数据:

[root@LinuxEA awk]# cat nr1
1 a
2 b
3 c
2 b
4 d
5 e
6 f
7 g

[root@LinuxEA awk]#
IX. 出现第一次匹配取后一行

[root@LinuxEA awk]# awk  "/2 b/{a++;b=NR}a==1&&NRb<=1 && NR-x>0" nr1
2 b
3 c
X. 出现第二次匹配,打印下面的行

[root@LinuxEA awk]# awk  "/2 b/{a++;b=NR}a==2&&NRb<=2 && NR-b>0" nr1
4 d
5 e
6 f
7 g

[root@LinuxEA awk]#
XI. 匹配中间数据

取出1 a 到4 d中间的数据

包括匹配行

[root@LinuxEA awk]# awk "/1 a/{p=1}/4 d/{print;p=0}p" nr1
1 a
2 b
3 c
2 b
4 d
[root@LinuxEA awk]#
不包括1 a行

[root@LinuxEA awk]# awk "/1 a/{p=1;next}/4 d/{print;p=0}p" nr1
2 b
3 c
2 b
4 d
[root@LinuxEA awk]#
不包括4 d行

[root@LinuxEA awk]# awk "/1 a/{p=1}/4 d/{p=0}p" nr1
1 a
2 b
3 c
2 b
[root@LinuxEA awk]#
不打印匹配行

[root@LinuxEA awk]# awk "/1 a/{p=1;next}/4 d/{p=0}p" nr1
2 b
3 c
2 b
[root@LinuxEA awk]#
XII. 过滤关键字中间的行

保留123(linuxea)和xaca(linuxea)中含有关键字的数据

实例文件

[root@LinuxEA awk]# cat file289
aaa
bbb
ccs
ddw
weq
123(linuxea)
szxc
sdaq
AZCA

SDQWQ
XXCA
ASDQ
XACA(linuxea)
BBB
[root@LinuxEA awk]#
保留123(linuxea)和xaca(linuxea)中含有关键字的数据

第一种方式:

将标签P作为数据下表,将123到结尾数据存入数组中,最后打印匹配linuxea值

[root@LinuxEA awk]# awk "/123/{p++}/./{a[p]=a[p]"\n"$0}END{for(i=1;i<=p;i++) if(a[i]~/\(linuxea\)/) print a[i]}" file289

123(linuxea)
szxc
sdaq
AZCA
SDQWQ
XXCA
ASDQ
XACA(linuxea)
BBB
[root@LinuxEA awk]#
第二种方式:

利用awk内置函数RS

[root@LinuxEA awk]# awk -v RS="123" "/linuxea/{print RS $0}" file289
123(linuxea)
szxc
sdaq
AZCA

SDQWQ
XXCA
ASDQ
XACA(linuxea)
BBB

[root@LinuxEA awk]#
XIII. 统计关键字的行

[root@LinuxEA awk]# cat file299
head no
1235 linuxea mark 1 @09    linuxea.com
1235 mark
head no
1234 mark linuxea.com
1235 mark
1235 mark linuxea.com
head no
1235 mark linuxea.com
1235 mark
1235 mark linuxea.com
1235 mark linuxea.com
统计linuxea.com的行数

[root@LinuxEA awk]# awk "/no/{p++;b[p]=$0}/linuxea.com/{a[p]++}END{for(i=1;i<=p;i++) print b[i],a[i]}" file299
head no 1
head no 2
head no 3
[root@LinuxEA awk]#
XIV. 打印奇数偶数行数

[root@LinuxEA awk]# cat file2991
1
2
3
4
5
6
7
8
9
10
[root@LinuxEA awk]# awk p++%2 file2991
2
4
6
8
10
[root@LinuxEA awk]# awk ++p%2 file2991
1
3
5
7
9
## 打印匹配关键字的行号
linuxea.com

[root@LinuxEA awk]# cat 1006
123
abc
aaaa
vwd
vvvvvv
deafwq
linuxea.com
dddddddddd
aaaaaaa
打印关键字vwd后出现的第一个linuxea.com所处行的行号

[root@LinuxEA awk]# awk "/linuxea.com/{p=NR}/vwd/{x=NR}p>x&&x>0{print p;exit}" 1006
7
[root@LinuxEA awk]#
XV. 取其关键字后N行

[root@LinuxEA awk]# awk "/vwd/{i=3;next}--i>=0" 1006
vvvvvv
deafwq
linuxea.com
[root@LinuxEA awk]#
取其关键字前三行

[root@LinuxEA awk]# awk "/\/{for(i=NR-3;i 123
abc
aaaa
[root@LinuxEA awk]# awk "{a[NR]=$0}/\/{for(i=NR-3;i 123
abc
aaaa
[root@LinuxEA awk]# awk "{a[NR]=$0}/vwd/{p=NR}END{for(i=p-3;i 123
abc
aaaa
[root@LinuxEA awk]# awk "{a[NR]=$0}/vwd/{for(i=NR-3;i 123
abc
aaaa
[root@LinuxEA awk]#

本文来源:http://www.bbyears.com/caozuoxitong/111658.html