首页 awk IO语句(七)

awk IO语句(七)

技术张儿 2018-9-21 0 230
标签: Linux·awk

语句
描述
getline
设置$0来自下一个输入记录
getline var
设置var来自写一个输入记录
command | getline [var]
运行命令管道输出到$0 或 var
netx
停止当前处理的输入记录
print
打印当前记录
printf fmt,expr-list
格式化输出
printf fmt,expr-list >file
格式输出和写道文件
system(cmd-line)
执行命令和返回状态
print ... >> file
追加输出到文件
peinr ...| command
打印输出作为命令输入


1)getline

获取匹配的下一行

[root@VM_16_3_centos ~]# seq 5|awk '/3/{getline;print}'
4

[root@VM_16_3_centos ~]# seq 5|awk '/3/{print;getline;print}'
3
4

再匹配的下一行加个星号

[root@VM_16_3_centos ~]# seq 5|awk '/3/{getline;sub(".*","&*");print}'
4*

[root@VM_16_3_centos ~]# seq 5|awk '/3/{print;getline;sub(".*","&*")};{print}'
1
2
3
4*
5

2)getline var

把a文件的行追加到b文件的行尾

[root@localhost ~]# cat a
a
b
c
[root@localhost ~]# cat b
1 one
2 two
3 three
[root@localhost ~]# awk '{getline line<"a";print $0,line}' b
1 one a
2 two b
3 three c

把a文件的行替换b文件的指定字段

[root@localhost ~]# awk '{getline line<"a";gsub($2,line,$2);print}' b
1 a
2 b
3 c

把a文件的行替换你b文件的对应字段

[root@localhost ~]# awk '{getline line<"a";gsub("two",line,$2);print}' b
1 one
2 b
3 three


3)command | getline [var]

获取执行shell命令后结果的第一行

[root@localhost ~]# awk 'BEGIN{"seq 5"|getline var;print var}'
1

循环输出执行shell命令后的结果
[root@localhost ~]# awk 'BEGIN{while("seq 5"|getline)print}'
1
2
3
4
5

4)next

不打印匹配的行

[root@localhost ~]# seq 5|awk '{if($0==3){next}else{print}}'
1
2
4
5

删除指定行

[root@localhost ~]# seq 5|awk 'NR==1{next}{print $0}'
2
3
4
5

如果前面动作成功,就遇到next,后面的动作不在执行,跳过。

或者:

[root@localhost ~]# seq 5|awk 'NR!=1{print}'
2
3
4
5

把第一行的内容放到每行的前面

[root@localhost ~]# cat a
hello
1 a
2 b
3 c
[root@localhost ~]# awk 'NR==1{s=$0;next}{print s,$0}' a
hello 1 a
hello 2 b
hello 3 c

[root@localhost ~]# awk 'NR==1{s=$0}NF!=1{print s,$0}' a
hello 1 a
hello 2 b
hello 3 c


5)sustem()

执行shell命令判断返回值

[root@localhost ~]# awk 'BEGIN{if(system("grep root /etc/passwd &>/dev/null")==0)print "yes";else print "no"}'
yes


6)打印结果写到文件

[root@localhost ~]# tail -n5 /etc/services |awk '{print $2 > "a.txt"}'
[root@localhost ~]# cat a.txt 
48556/tcp
48556/udp
48619/tcp
48619/udp
49000/tcp

7)管道连接shell命令

将结果通过grep命令过滤

[root@localhost ~]# tail -n5 /etc/services |awk '{print $2|"grep tcp"}'
48556/tcp
48619/tcp
49000/tcp


作者: 技术张儿 本文发布于2018-9-21 10:08:21
免责声明:本文仅代表作者个人观点。