### awk

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"\t"$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

posted @ 2015-08-23 20:14  bairuiworld  阅读(190)  评论(0)    收藏  举报