awk [选项参数] 'script' var=value file(s) 或 awk [选项参数] -f scriptfile var=value file(s)
-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。正则表达式
-v var=value or --asign var=value
赋值一个用户定义的变量。
---数组
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
BEGIN语句块在awk开始从输入流中读取行以前被执行,这是一个可选的语句块,好比变量初始化、打印输出表格的表头等语句一般能够写在BEGIN语句块中。函数
END语句块在awk从输入流中读取完全部的行以后即被执行,好比打印全部行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。若是没有提供pattern语句块,则默认执行{ print },即打印每个读取到的行,awk读取的每一行都会执行该语句块。工具
echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'
当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格做为定界符。在awk的print语句块中双引号是被看成拼接符使用,例如:命令行
echo | awk '{ var1="v1";var2="v2";var3="v3";print var1,var2,var3;}' v1 v2 v3
双引号拼接使用:code
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3
{ }相似于一个循环体,会对文件中的每一行进行迭代,一般变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放入END语句块中。ip
说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk字符串
$n 当前记录的第n个字段,好比n为1表示第一个字段,n为2表示第二个字段。table
$0 这个变量包含执行过程当中当前行的文本内容。class
支持工具 | 变量名 | 描述 |
---|---|---|
[A] | FILENAME | 当前输入的文件名 |
[A] | FS | 字段分隔符 |
[A] | NF | 字段数,在执行过程当中对应于当前的字段数 |
[A] | NR | 记录数,执行过程当中对应于当前的行号 |
[A] | OFMT | 数字的输出格式 |
[A] | OFS | 输出字段的分隔符 |
[A] | ORS | 输出记录的分隔符 |
[A] | RS | 记录分隔符 |
[N] | ARGC | 命令行参数的数目 |
[N] | ARGV | 包含命令行参数的数组 |
[N] | ERRNO | 最后一个系统错误的描述 |
[N] | RSTART | 由match函数所匹配的字符串的第一个位置 |
[N] | RLENGTH | 由match函数所匹配的字符串的长度 |
[N] | SUBSEP | 数组小标分隔符(默认值是34) |
[G] | ARGIND | 命令行中当前文本的位置(从0开始计算) |
[G] | CONVFMT | 数字转换格式 |
[G] | FIELDWIDTHS | 字段宽度列表 |
[G] | IGNORECASE | 若是为真,则进行忽略大小写的匹配 |
[P] | ENVIRON | 环境变量关联数组 |
[P] | FNR | 同NR,但相对于当前文件 |
awk 'END{print NR}' filename
awk '{ print $2,$3}' filename
echo -e "line1 f2 f3 \n line2 f4 f5" | awk '{print $(NF-1)}'
seq 5 | awk 'BEGIN{ sum=0;print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum}'
VAR=10000 echo | awk -v variable=$VAR '{ print variable }'
var1="aaa" var2="bbb" echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename
以上方法中,变脸之间用空格分隔做为awk命令行的参数数据跟随在BEGIN、{ }和END语句块以后。
cat test.txt a b c d e f awk 'NR%2==1{next}{print NR,$0;}' text.txt 2 b 4 d
cat tmp.log |awk '{print $15}'|awk -F'=' '{print $5}'
cat tmp.log |awk '{print $15}'|awk -F'=' '{print $5}' | sort | uniq -c