首页 > 代码库 > awk命令

awk命令

1.awk工作流程


a)先执行BEGIN;
b)读取文件,读入有/n换行符分割的一条记录
c)将记录按指定的域分隔符进行划分域
d)填充域,其中$0表示所有域,$1表示第一个域,$n表示第那个域(默认域分隔符是空白键或者tab键)
e)开始执行模式所对应的动作action
f)接着开始读入第二条记录,直到所有的记录都被读完
g)执行END操作


2.使用方法


awk [-F field-separator] ‘{pattern + action}‘ {filenames}
1. pattern表示awk在数据中查找的内容,action表示在找到匹配内容时所执行的一系列命令。action{}可以有多个语句,以";"号隔开。
2. [-F域分隔符]是可选的。 filenames是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

3.awk内置变量


ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

4.awk内置字符串函数


gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(str,array,fs ) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p)     返回字符串s中从p开始的后缀部分
substr(s,p,n)   返回字符串s中从p开始长度为n的后缀部分

5.BEGIN和END


BEGIN表示在处理任意行之前进行的操作
END表示在所有输入行处理完后进行的处理。

6.条件语句


if (expression) {
    statement;
    statement;
    ... ...
}

if (expression) {
    statement;
} else {
    statement2;
}

if (expression) {
    statement1;
} else if (expression1) {
    statement2;
} else {
    statement3;
}

7.数组


因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
root
daemon
bin
sys
sync
games
......

awk -F‘\t‘ ‘{ a[$1]++ }‘END‘{ for(j in a) print a[j],j }‘ filename | sort -rn | more 
filename的内容为:
apple
banana
apple
apple
banana
pear

输出结果为:
3 apple
2 banana
1 pear