### 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  阅读(161)  评论(0编辑  收藏  举报