1.awk:样式扫描和处理语言
2.awk比sed和grep都优秀:sed倾向于对一整行的处理。awk支持对记录和字段的处理,而sed和g rep不能对字段进行处理。awk将一行视为一个记录,将一行中的某一部分作为记录的一个字段,用$1,$2,$3...表示行中的不同字段,用$0表示整个行。
3.分隔符变量FS,目前所处理的行数NR,每一行拥有的字段总数NF,输入记录分隔符RS,输出记录分隔符ORS
例一:显示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:
awk -F % 'NR==7,NR==15 {printf $1 $3 $7}'
4.awk有很多内置函数,比如printf(),length()。
例二:$awk 'length($0)>80 {print NR}' myfile
该命令行将显示文本myfile中所有超过80个字符的行号,在这里,用$0表示整个记录(行),同时,内置变量NR不使用标志符'$'。
5.awk的变量:awk变量包括自定义变量和内置变量,awk引用变量不需要$符号(如NR),所有变量都可以直接使用。不需要初始化。
6.作为样式匹配,awk提供了~匹配于,!~不匹配于
例三:文件a,统计文件a的第一列中是浮点数的行的浮点数的平均值
$cat a
1.021 33
1#.ll 44
2.53 6
ss 7
awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+\.[0-9]*/){total += $1; len++}} END{print total/len}' a
根据我的猜测,~匹配/ /中的内容。
7.awk提供了BEGIN和END两个特殊表达式,BEGIN之后的操作 {}将在awk扫描输入之前执行,END之后的操作将在扫描之后执行。
8.函数function。
9.高级输入输出:
(1)next 读取下一条记录。
(2)getline 读取一条记录。
(3)close("filename")关闭文件
10.awk中print和printf的区别:
print输出指定内容后换行,printf输出指定内容后不换行。
11.awk使用shell的变量:用-v选项将shell的变量定义成为awk变量。
$var="this is a test"
awk -v nvar="$var" '{print nvar}'
例四:用awk合并行:
-
linecount=3
-
awk -v n=${linecount} '{if (NR%n==0){print $0} else {printf"%s ",$0}}' filename
-
111111111 222222222 333333333
-
444444444 555555555 666666666
-
777777777 888888888 999999999
或: awk '{if(NR%4!=0){ORS=" "} else {ORS="\n"} print}' filename
或:awk '{if(NR%4!=0)ORS=" ";else ORS="\n";print}' filename
由上可看出,{}和;的使用可以替换
ORS是输出记录分隔符。
例五:omiga@omiga:~/workplace/shell$ cat testawk4
gaga
sunhehe
gag
gag
gag
gag
moonhehe
gag
gag
显示出匹配sun和moon之间的行:
awk '/[Ss]un/,/[Mm]oon/ {print}' testawk4
sunhehe
gag
gag
gag
gag
moonhehe
显示出匹配sun和moon的行:(注意中间没有逗号)
awk '/[Ss]un/ {print} /[Mm]oon/ {print}' testawk4
sunhehe
moonhehe
12.awk的模式:awk ‘条件类型1{动作1} 条件类型2{动作2} 条件类型3{动作3} 。。。。。’ filename
重要:awk 中什么时候用,什么时候用;什么时候用空格就行
条件类型里面/ / 表示匹配,/ / 和/ / 之间用的是“,”
动作里面区分几个动作用的是“;”
条件类型{动作} 之间用的是空格
12.
阅读(1690) | 评论(0) | 转发(0) |