一:AWK内置变量
- $0:表示整个当前行
- $1:每行第一个字段
- $2:每行第二个字段
- NR:每行的记录号
- NF:字段数量变量
- FILENAME:文件名
二:AWK常用命令展示
练习文件:passwd文件(/etc/passwd)如下:
【练习1:打印出第一列的内容即账户名称】
awk -F':' '{ print $1 }' passwd
解释:-F后面跟分隔符 冒号:,因为awk默认的分隔符是空格或tab制表符。
print打印函数,$1第一列。
【拓展:用cut方式】
cut -d ':' -f1 passwd
【练习2:只是显示passwd的账户和账户名称对应的shell,而账户与shell之间用制表符分割,而且在所有行开始前添加列名name,shell,在最后一行添加“blue,/bin/nosh"】
awk -F':' 'BEGIN{ print "name\tshell" }{print $1 "\t" $7}END{print "blue\t/bin/nosh"}' passwd
【练习3:在passwd文件中搜索有关键字root的所有行】
awk '/root/ {print $0}' passwd
解释:$0代表所有行
【练习4:统计passwd文件中,每行的行号,每行的列数,对应的完整行内容】
awk -F':' '{print NR "\t" NF "\t" $0}' passwd
解释:行号是NR,列数是NF。
如果不指定分隔符(默认分隔符为空格),列数会发生变化:
练习文件awk.txt如下:
Tom 0 2012-12-11 car 3000
John 1 2013-01-13 bike 1000
Vivi 1 2013-01-18 car 2800
Tom 0 2013-01-20 car 2500
John 1 2013-01-28 bike 3500
【练习5:合计每人1月工资,0:manager,1:worker】
awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5};if($2=="0"){role[$1]="manager"}else{role[$1]="worker"}}END{for(i in name){print i "\t" role[i] "\t" name[i]}}' awk.txt
【拓展:用awk脚本方式 awk.sh】
{
split($3,date,"-"); ##分割月份,并存入数据
if(date[2]=="01")
{name[$1]+=$5};
if($2=="0")
{role[$1]="manager"}
else
{role[$1]="worker"}
}
END{
for(i in name)
{
print i "\t" role[i] "\t" name[i]}
}
执行脚本如下:
awk -f awk.sh awk.txt ###要用小写f