awk -f program-file file awk program-text file
-F
不写默认为 -F " "
使用多个分界符 -F [@#] 或者 -F '@|# '
# echo "$USER $(date -I):$HOSTNAME" | awk -F "[ :]" '{print $3}' # echo "$USER $(date -I):$HOSTNAME" | awk -F ' |:' '{print $3}'
使用组合分界符
# last -n 5 |gawk -F ' +-? *' '{print $8}'
-v
定义变量
# awk -v root="root" -F: '{if($1==root){print $7}}' /etc/passwd
-f
awk脚本的编写
# cat test.awk BEGIN{ FS=":" } { if ($1=="root"){ print $7 } } END{ print "It is over." }
自带变量的含义及修改效果
NR
到此为止,输入的记录条数
FNR
到此为止,本文件输入的记录条数
# awk -F: '{print $1"\t\t"FNR,NR}' passwd /etc/passwd
FS
输入的field之间的分界符
OFS
输出的field之间的分界符
# awk 'BEGIN{FS=":";OFS="@"}/root/{print $1,$2,$3}' /etc/passwd
RS
输入的record之间的分界符
# while read line; do echo $line | awk 'BEGIN{FS="@";RS=" "}{print $2}' ; done <<< $(echo -e "1@2@3@4 a@b@c@d@e ha@hb@hc@hd@he\nda@db@dc@dd@de ja@jb@jc@jd@je pa@pb@pc@pd@pe")
ORS
输出的record之间的分界符
# while read line;do echo $line | awk 'BEGIN{FS="@";RS=" ";ORS="###"}{print $2}' ; done <<< $(echo -e "1@2@3@4 a@b@c@d@e ha@hb@hc@hd@he\nda@db@dc@dd@de ja@jb@jc@jd@je pa@pb@pc@pd@pe")
NF
一条record被分成field的数目
# awk 'BEGIN{FS=":";OFS="@"}/root/{print (NF-1),$(NF-1)}' /etc/passwd
OFMT
定义输出小数的格式
# awk 'BEGIN{print 2/3;OFMT="%.2g";print 2/3}'
RT
类似于RS,但是结尾处理比RS好
echo "111 222|333 444|555 666"|awk 'BEGIN{RS="|"}{print $0,RT}'
逻辑判断
awk '/root/{if((3 == 2)||(2==2)){print $1}}' /etc/passwd awk '/root/{if((3 == 2)&&(2==2)){print $1}}' /etc/passwd awk -F: '($1=="root"){print $0}' /etc/passwd awk -F: '/root/{NF<5?var=NF:var=5;{print $2,var}}' /etc/passwd awk -F: '$1=="root", $1=="halt"{print $0}' passwd
格式化输出
awk -F: '/root/{printf "%10s\n",$1}' /etc/passwd %c ,%d, %i ,%e, %E,%f, %F,%g, %G,%o,%u,%s,%x, %X,%%