单引号内是 'pattern {actions}'
可以是 'pattern1, pattern2 {actions}',表示处理 满足pattern1的行 与 满足pattern2的行 之间的行(闭区间)。
匹配正则:~
不匹配正则:!~
FS: The input field separator.(-F指定时实际上是用正则表达式)
NF: The total number of fields in the input record.(fields就是被FS分隔出来的一块一块的区域,起始为1)
NR: The total number of input records seen so far.(就是当前处理的record的序号,起始为1)
samples:
#echo "a+b-c*d/e" | awk -F"[+*/-]" '{for(i=1;i<=NF;i++){print i": "$i}}'
-F后面是正则表达式。
不过有时这样指定会有问题,可能是因为正则里中括号内不在边上的'-'被当作用于指定字符范围了(像[0-9]那样)。
#kill `ps aux | grep kate | grep -v grep | awk -F" " '{print $2}'`
``内的东西会被替换为那一串东西的执行结果,此例中就是一行行的pid。
awk -F" " 是指以空格作为分隔符(实际上默认就是空格),这样$2就是pid了。
#cat /etc/passwd | awk -F":" 'BEGIN{ok = 0}; {if($1=="root"){ok=1}; if(ok!=0){printf("username: %s\n", $1)}; if($1~/^wang/){ok=0};}'
处理两行之间,可以这样:
#cat /etc/passwd | awk -F":" 'BEGIN{print "==="} $1=="root", /^wang/ {print $1} END{print "==="}'
#ps aux | awk 'BEGIN{print "BEGIN"; sum1=0; sum2=0}; (NF>=11 && $11 ~/bin/ && $11 !~/sbin/) {print $11; sum1++}; (NF>=11 && $11 ~/sbin/) {print " "$11; sum2++}; END{print "\nsum1="sum1; print "sum2="sum2;print"END"};'
/// inside function //
数组都是起始为1的,index查字串位置,没查到返回0。
gsub全部替换,sub只替换一个。
samples:
#cat /etc/passwd | awk -F":" '{"date" | getline line; split(line, array, " "); time=array[4]; print time"\t"$1 }'