Linux awk

单引号内是 '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 }'




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值