一、awk的基本使用
awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab。
awk命令行的基本形式为:
awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2 ..
和sed一样,awk处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,编辑命令可以直接当命令行参数传入,也可以用-f参数指定一个脚本文件,编辑命令的格式为:
/pattern/{actions}
condition{actions}
二、awk命令
☆☆☆☆☆打印
<span style="font-size:18px;">[root@localhost AWK]# awk '{print $0}' file //
producta 10
productb 90
productc 70
productd 67
producte 89
[root@localhost AWK]# awk '{print $NF}' file //显示最后一列
10
90
70
67
89
[root@localhost AWK]# awk '{print $2}' file //显示第二列
10
90
70
67
89
[root@localhost AWK]# awk '{print $1}' file //显示第一列
producta
productb
productc
productd
producte
[root@localhost AWK]# cat file //显示文件内容
producta 10
productb 90
productc 70
productd 67
producte 89
</span>
(2)加上约束条件:>70合格,反之不合格
<span style="font-size:18px;">[root@localhost AWK]# awk '$2>70{print $0 ,"Y";} $2<=70{print $0,"N"}' file //condition{action}
producta 10 N
productb 90 Y
productc 70 N
productd 67 N
producte 89 Y</span>
☆☆☆☆☆统计一个文件中的空行数
[root@localhost AWK]# grep -E '^$' file |wc -l
1
[root@localhost AWK]# sed -n '/^$/p' file |wc -l
1
[root@localhost AWK]# awk 'BEGIN{count=0;}/^$/{count++}END{print count}' file
1
(1)命令行方式
(2)shell脚本方式
[root@localhost AWK]# chmod 755 test.awk
[root@localhost AWK]# ./test.awk file
2
2
3
[root@localhost AWK]# cat file
producta 10
productb 90
productc 70
productd 67
productl 45
producte 89
[root@localhost AWK]# cat test.awk
#!/usr/bin/awk -f
BEGIN{
goods=0;
pass=0;
bads=0;
}
{
if($2>=80){
goods++;
}
else if($2>=60){
pass++;
}
else{
bads++;
}
}
END{
printf("%d\n",goods);
printf("%d\n",pass);
printf("%d\n",bads);
}
(3)将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
[root@localhost AWK]# awk -f test.awk file
2
2
3
ARGC 命令行参数个数
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以
此类推。可以通过指定域分隔符,来格式化输入输出
练习:统计某个文件夹下的文件占用的字节
[root@localhost AWK]# ls -lR /home/admin/BinaryTree | awk 'BEGIN{size=0}/.+\.c$/{size+=$5}END{print size}'
1341