1.AWK的pattern
BEGIN
END
expression 例: NF>10 或/^a/
/regular expression/?
可以?用类似/^a/这种写法
另一种写法$1 ~ /^a/ //字段匹配
表达式之间可以?用&& || ! ?: 等操作符做布尔运算(当然可以是正则表达式)
expression , expression 表?示开始和结束 例: NF==5,NF==10
例子1: cat /etc/passwd |awk -F":" ‘NR==5,NR==10{print NR,$1}‘ //只显示passwd文件的第5-10行,并定义字段分隔用:号
5 sync
6 games
7 man
8 lp
9 mail
10 news
知识点:1.-F参数。2.expression , expression的用法。
2.AWK的action
完善的编程语?言?支持变量赋值、数组、判断、循环、?自定义函数
有很?方便的预定义的变量和函数
最常?用的是print函数
字段取值$1、$2、$3……$NF
$0就是文件的所有行
注意:awk的定义变量不是一定非得$符号开头,$符号是取字段值。
例子2:awk ‘BEGIN{RS="[^0-9a-zA-Z]"};{count[$0]++};END{for (i in count) print i,count[i]}‘<1.txt
iwant 1
chinawelcome 1
ilove 1
to 7
china 4
love 4
changsha 5
i 4
beijing 2
welcome 5
you 5
注:语句作用:将文件的每一个单词提取出单独成行,并统计单词出现的次数。
知识点:1.BEGIN,END块的写法和使用({}括起来,;来隔开)。2.分隔符RS和FS的区别(RS:遇到RS即另开一行)。3.数组的使用。4.for循环。5.文件重定向输入
例子3 对上面例子进行扩展(排序并写入新文件)
awk ‘BEGIN{RS="[^0-9a-zA-Z]"};{count[$0]++};END{for (i in count) print i,count[i] | "sort -r -k2 -o 3.txt" }‘<1.txt
知识点:1.print用法。print … | command : 运?command命令并将print的输出作为command的输?。注意整个command包括参数所有部分都在双引号内
2. sort用法。-o参数将排序结果写入文件,而此重定向文法完成。
3. getline的用法
例子:将文件合并起来。
vi join.awk
#!/usr/bin/awk -f
{
getline sl<ARGV[2]
print $0 sl
}
执行:awk -f join.awk file1 file2