1. awk命令格式和选项
awk [options] 'script' var=value file
例如:awk '{print str}' str="hello" file
awk [options] -f script.file
2.模式和操作
awk脚本由模式和操作组成
pattern {action} , 如 awk '/yang/ {print $1}' file#当正则表达式被匹配上之后将第一列打印出来
也可以只包含pattern,此时会将匹配pattern的所有行打印出来;同样可以只包含action,此时会对所有的行操作(相当于pattern为.*)
模式:
模式可以是以下的任意一种:
/正则表达式/:使用通配符的扩展集
关系表达式:可以是字符串或者数字的比较,例如:$1<100;或者$2>%1(第二个字段比第一个字段长的行)
模式匹配表达式:用运算符~和~!表示匹配和不匹配
BEGIN和END
例如:
awk '$1 ~/^yang/' file #第一列的开头匹配上yang的行打印出来
范围模板:
范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间的所有行。如果有一个模板没有出现,则匹配到开头或者结尾。
例如:
awk '/root/,/mysql/' file 将显示第一次出现root到第一次出现mysql中间所有的行
awk 'IGNORECASE=1; $1=="test"{print NF}'忽略大小写统计第一列为test的行数
awk '{"date" | getline d;print d}' file 执行linux的date命令,并通过管道输出给getline,然后将其赋值给变量d,并打印改变量
awk '{"date" | getline d; split(d, mon); print mon[2]}' file;将变量d进行切分,存放到数组mon中并打印第二个元素
awk 'BEGIN{print "what's your name:" ; getline name < "/dev/tty"} $1 ~name{print "found your name on line", NR"."}' file
一、简单示例
awk '{print}' /etc/passwd #打印文本文件中的所有行数
awk逐行处理/etc/passwd,针对每一行都会调用一次'{print}'代码块;
二、多个字段
awk -F":" '{print $1}' /etc/passwd, 以”:“将文本分割,打印第一列;
也可以awk -F":" '{print "username:"$1}' /etc/passwd打印额外字符串
三、执行awk文件
awk -f test.awk /etc/passwd #此时将会针对文件中的每一行调用test.awk中的代码块
#test.awk
BEGIN{
FS=”:“ #和-F":"的功能一样,都是将FS环境变量设置为":"
print "begin"
}
{
print $1
}
END{
print "end"
}
BEGIN代码块在最开始的时候执行一次,例如做一些初始化之类的操作;END代码块在所有行处理完之后执行的代码块;{}代码块为每一行的处理模块
例如:file中每一行为一个单词,统计单词的个数的时候的代码块如下:
{
a[$1] = a[$1]+1
}
END{
for(i in a){
print i":"a[i]
}
}