学习linuxjishu/13830.html target=_blank class=infotextkey>awk命令的技巧,重在实践,勤于练习,多用awk去分析处理数据文件,慢慢就会熟能生巧。
重点应放在awk命令参数选项,比如分隔符,Begin与end语句块,以及内置函数等知识点上。
1、显示第一次出现diglike到第一次出现redis的所有行.
 
2、打印以dig或root开头的行:
 
3、打印以d或m开头的用户
 
4、打印后两们是数字的用户
 
5、查找包含diglike的行,并将第三个域加100打印出来
 
6、匹配包含diglike的行,根据第三个域大小输出内容
 
7、变量赋值
 
8、域变量赋值
 
9、begin模块
 
diglike@LinuxGit:~$ awk 'BEGIN{FS=":";OFS="t";ORS="nn"}{print $1,$3}' /etc/passwd | head -3
root        0
daemon 1
10、打印标题
 
11、END模块
 
12、重定向:
 
13、管道:
 
$ awk 'BEGIN{"date"|getline d;split(d, mon);print mon[2]}'
Nov
$ awk 'BEGIN{while("ls"|getline) print}'
a
bin
Desktop
Documents
Dowell web
Downloads
examples.desktop
$ awk 'BEGIN{while(getline<"/etc/passwd">0) count++;print count}'
38
getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。
14、执行系统命令:
 
15、if语句 
 
更简洁:
 
diglike@LinuxGit:~$ awk -F: '$3<$4{print $1}' /etc/passwd
sync
games
man
libuuid
syslog
messagebus
colord
lightdm
whoopsie
avahi-autoipd
avahi
kernoops
pulse
rtkit
saned
mongodb
redis
memcache
dnsmasq
if else
$ awk -F: '{if($3==$4) print $1 " yes";else print $1 " no"}' /etc/passwd
root yes
daemon yes
bin yes
sys yes
sync no
games no
man no
$ awk -F: '{if($3==$4){print $1 " yes"} else {print $1 " no"}}' /etc/passwd
更简洁的代码:
 
$ awk -F: '{print ($3==$4?$1 " yes":$1 " no")}' /etc/passwd | head -5
root yes
daemon yes
bin yes
sys yes
sync no
for  while
diglike@LinuxGit:~$ awk 'BEGIN{i=1;while(i<=3) { print "Linux",i;i++ }}' 
Linux 1
Linux 2
Linux 3
diglike@LinuxGit:~$ awk 'BEGIN{for(i=1;i<=3;i++) print "Linux",i }'
Linux 1
Linux 2
Linux 3