awk 高级输入输出
读取下一条记录
root@ubuntu:~# awk 'NR%2==1{next}{print NR,$0;}' cats.txt
2 my cat's name is betty
4 my dog's name is frank
6 my fish's name is george
8 my goat's name is adam
分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行:
cat web.txt
web01[192.168.2.100]
httpd ok
tomcat ok
sendmail ok
web02[192.168.2.101]
httpd ok
postfix ok
web03[192.168.2.102]
mysqld ok
httpd ok
root@ubuntu:~# awk '/^web/{T=$0;next;}{print T":\t"$0;}' web.txt
web01[192.168.2.100]: httpd ok
web01[192.168.2.100]: tomcat ok
web01[192.168.2.100]: sendmail ok
web02[192.168.2.101] : httpd ok
web02[192.168.2.101] : postfix ok
web03[192.168.2.102] : mysqld ok
web03[192.168.2.102] : httpd ok
getline 函数
awk getline用法:输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。
- 当其左右无重定向符|或<时:getline作用于当前文件,读入当前文件的第一行给其后跟的变量var或$0(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。
- 当其左右有重定向符|或<时:getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。
root@ubuntu:~# awk 'BEGIN{ "date" | getline out; print out }' test
Sat Oct 29 12:10:45 PDT 2016
root@ubuntu:~# awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test
Oct
root@ubuntu:~# awk 'BEGIN{ while( "ls" | getline) print }'
1
1n
1.txt
cats.txt
herpets.txt
html.txt
my.txt
nohup.out
pets.txt
pet.txt
web.txt