awk很有用,就不说了,下面记录几个我遇到的例子,汇总
1 获得linux环境变量(ENVIRON)
awk ‘BEGIN{print ENVIRON["PATH"];}‘ /etc/passwd
结果: /home/homer/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
注: ENVIRON是子典型数组,可以通过对应键值获得它的值,linux 环境变量还有$HOME,$PWD等,可以通过linux 命令 env 查看
2 外部环境变量
awk ‘BEGIN{for (i in ENVIRON) {print i"="ENVIRON[i];}}‘
结果:
HLVL=1
PWD=/home/homer
JAVA_HOME=/home/homer/eclipse/jdk1.7.0_05
SHELL=/bin/bash
PATH=/home/homer/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
..........
注: ENVIRON是子典型数组,可以通过对应键值获得它的值,linux 环境变量还有$HOME,$PWD等,可以通过linux 命令 env 查看
例1 关于NR和FNR的典型应用(转载):
现在有两个文件格式如下:
#cat account
张三|000001
李四|000002
#cat cdr
000001|10
000001|20
000002|30
000002|15
想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:
张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
执行如下代码
#awk -F \| ‘NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}‘ account cdr
注释:
1 由NR=FNR为真时,判断当前读入的是第一个文件account,然后使用{a[$2]=$0;next}循环将account文件的每行记录都存入数组a,并使用$2第2个字段作为下标引用.
脚本里面的next是指读入下一个输入行,并返回脚本的顶部,即awk -F \| ‘NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}‘,每次都执行到next然后循环执行绿色部分,红色的都不执行。这部分实际的赋值结果是
root.~:awk -F \| ‘NR==FNR{a[$2]=$0; print "a("$2")=" ,a[$2];next}‘ account
a(000001)= 张三|000001
a(000002)= 李四|000002
2 由NR=FNR为假时,判断当前读入了第二个文件cdr,然后跳过{a[$2]=$0;next},对第二个文件cdr的每一行都无条件执行{print a[$1]"|"$2},此时变量$1为第二个文件的第一个字段(即 000001 000002),使用a[$1]引用了步骤1得出的数组,然后随着$1的变化,输出完整的数组
root.~:awk -F \| ‘NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}‘ account cdr
张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
例2 awk 判断 (也可循环,此不表)
首先说下,功能是把a中TIME和b中的TIME相同的OUT_FLOW值加在file1中,并且多加一列,该列值为1(当OUT_FLOW在UP和LOW之间)或0(当OUT_FLOW不在UP和LOW之间) ,a、b中Time不同的不用显示
cat b:
Time Name C_name Up Low
1 dns1 godedy 5 1
2 dns2 dnspod 5 3
3 dns3 na 8 2
5 dns4 cnnc 4 2
cat a:
Time C_name Out_flow
1 dnspod 3
2 godedy 6
3 cnnc 3
4 cnnc 4
root.~:awk ‘NR==FNR{Time[$1]=$3} NR>FNR{if (Time[$1]) print $0, Time[$1] }‘ a b |awk ‘{if ($6>$5&&$6<$4) print $0,0 ;else print $0,"1"}‘ >file1
Time Name C_name Up Low Out_flow 0
1 dns1 godedy 5 1 3 0
2 dns2 dnspod 5 3 6 1
3 dns3 na 8 2 3 0
注释:
1 当NR==FNR为真时,执行Time[$1]=$3,依次把a中time的值放入数组Time[$1]=中,此时处理的是文件a
2 当NR>FNR为真时,此时处理的文件是b,执行if (Time[$1]) print $0, Time[$1],这里的if是为了去除存在于b而不存在于a中的Time,此命令把a、b文件Time相同的合并起来,以便下部处理
3 |管道符后面的语句,awk ‘{if ($6>$5&&$6<$4) print $0,0 ;else print $0,"1"}‘,判断Out_flow是否介于Low和Up之间,是则为1,否则为0,并打印输出
4 >file1,将结果重定向到文件file1中
参考:
linux shell awk 流程控制语句(if,for,while,do)详细介绍
原文:http://www.cnblogs.com/lizhaoxian/p/4859138.html