linux过滤两行内容,Linux中Awk常用文本处理[2]

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]#

5c1967c5325842cec010c6abd3e07965.gif

除非另有说明,否则本站上的内容根据以下许可进行许可: CC署名-非商业性使用-相同方式共享4.0国际许可协议4.0进行许可

本文作者:www.linuxea.com for Mark

文章链接:http://www.linuxea.com/1464.html (转载请注明本文出处和本章链接)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值