awk.
#@author: gr
#@date: 2014-07-02
#@email: forgerui@gmail.com
1. 基本使用
1.1. 基本模式
awk '{pattern + action}' {filenames}
1.2. 常用命令
#-F指定分隔符
cat /etc/passwd |awk -F ':' '{print $1}'
cat /etc/passwd |awk -F ':' '{print $1" "$7}'
# BGEIN,END使用
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
#查找有“root”关键字的行
awk -F: '/root/' /etc/passwd
awk -F: '/^root/' /etc/passwd #支持正则表达式
#对搜索行进行处理
awk -F: '/root/{print $7}' /etc/passwd
1.3 内置变量
NF:
表示一行域个数,当然, $NF
就表示最后一个域的值。
echo "hello world you are not alone" | awk '{print NF}' #结果为6
echo "hello world you are not alone" | awk '{print $NF}' #结果为alone
NR:
表示已经读取的记录数:
[gr@centos ~]$ cat test
12
3
hello world
[gr@centos ~]$ awk '{print NR}' test #每读一行会显示一次
1
2
3
可以用来最后做统计信息用:
[gr@centos ~]$ awk 'END{print NR}' test #这个值可以用来统计其它信息,如每行平均单词数,也可以用来做遍历的临界值
3
[gr@centos ~]$ awk 'END{for (i = 0; i < NR; i++) print i}' #使用NR值做为判断条件
FILENAME:
当前处理文件名:
[gr@centos ~]$ awk 'END{print FILENAME}' test.txt
test.txt
[gr@centos ~]$
2. 调用awk
有三种方式调用awk。
2.1. 命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2.2. shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
2.3. 将awk命令放到文件中,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
3. awk编程
3.1. 统计账户人数
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
初始化变量:
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
3.2. 统计某个文件夹下的文件占用的字节数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
以M为单位:
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
3.3. 条件语句
借鉴C的方式:
if (expression) {
statement;
statement;
... ...
}
if (expression) {
statement;
} else {
statement2;
}
if (expression) {
statement1;
} else if (expression1) {
statement2;
} else {
statement3;
}
3.4. 数组
awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
统计命令使用:
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n20
统计文章单词个数:
awk '{for (i = 1; i <= NF; i++) a[$i]++} END{for (i in a) print i " " a[i]}' words.txt | sort -nr -k 2