语法
$ awk [options] 'command' file(s)
options:
-F 指定分隔符,默认为空格。
-f 执行一个脚本文件:awk -f awk-script-file file(s)
command:
[pattern:正则表达式、逻辑判断式]
{awk操作命令:print printf getline if else while}
示例
内置变量:
1
0: 表示整个当前行
2 : 每行第二个字段
$ awk -F ':' '{print $1}' passwd
root
......
user000
mysql
$ awk -F ':' '{print $1,$3}' passwd
nobody -2
root 0
daemon 1
......
$ awk -F ':' '{print "User:"$1 "\t" "UID:"$3}' passwd
User:nobody UID:-2
User:root UID:0
User:daemon UID:1
$ awk -F ':' '{if ($3 > 260) print "User:"$1"\t""UID:"$3}' passwd
User:_hidd UID:261
User:_cmiodalassistants UID:262
User:_analyticsd UID:263
User:_fpsd UID:265
User:_timed UID:266
$ awk -F ':' '/root/{print $0}' passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
#注意'\'左右不要有空格,文件名要写在最后一行command后面
$ awk -F ':' 'BEGIN{count=0}'\
> '{if ($3 > 100) name[count++]=$1}'\
> 'END{for(i=0;i<count;i++) print i,name[i]}' passwd
0 _softwareupdate
1 _coreaudiod
2 _screensaver
... ...
内置变量:NR NF FILENAME
NR 每行记录号
NF 字段数量
FILENAME 处理的文件名
$ awk -F ':' '{print FILENAME,NR,NF}' passwd
passwd 1 7
passwd 2 7
passwd 3 7
passwd 4 7
passwd 5 7
$ awk -F ':' '{printf("Line:%3s Col:%s User:%s\n",NR,NF,$1)}' passwd
Line: 1 Col:7 User:nobody
Line: 2 Col:7 User:root
Line: 3 Col:7 User:daemon
匹配正则表达式&逻辑表达式
匹配正则表达式:、!
逻辑表达式:==,!=,<,>
$ awk -F ':' '$1~/^r.*/{print $0}' passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
$ awk -F ':' '$1=="root"{print $0}' passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
$ awk -F ':' '$3>250{print $0}' passwd
_xserverdocs:*:251:251:macOS Server Documents Service:/var/empty:/usr/bin/false
_wwwproxy:*:252:252:WWW Proxy:/var/empty:/usr/bin/false
_mobileasset:*:253:253:MobileAsset User:/var/ma:/usr/bin/false
......
扩展表达式:BEGIN、END
$ awk -F ':' 'BEGIN{print "Line Col User"} {print NR" "NF" "$1} END{print "==========="FILENAME"==========="}' passwd
Line Col User
1 7 nobody
2 7 root
......
98 7 _timed
===========passwd===========
#统计大小
$ ls -l | awk 'BEGIN{size=0} {size+=$5} END{print "size is " size/1024/1024"mb"}'
size is 81.07mb
$ du -sh
81M .
$ awk -F ':' '$1~/root|daemon/{sum[$1]++} END{for (i in sum) print i,sum[i]}' passwd
root 1
_cvmsroot 1
daemon 1
网友评论