awk系列3--比较全面
在各大网站看到的 自己整理的
awk学习实例 [root@localhost opt]# cat grade.txt M.Tansley 05/99 48311 Green 8 40 44 J.Lulu 06/99 48317 green 9 24 26 P.Bunny 02/99 48 green 12 35 28 J.Troll 07/99 4842 Brown-3 12 26 26 L.Tansley 05/99 4712 Brown-2 12 30 28 [root@localhost opt]# awk '{if($4~/Brown/)print $0}' grade.txt J.Troll 07/99 4842 Brown-3 12 26 26 L.Tansley 05/99 4712 Brown-2 12 30 28 [root@localhost opt]# awk '{if($3~/48/) print $0}' grade.txt M.Tansley 05/99 48311 Green 8 40 44 J.Lulu 06/99 48317 green 9 24 26 P.Bunny 02/99 48 green 12 35 28 J.Troll 07/99 4842 Brown-3 12 26 26 [root@localhost opt]# awk '{if($3==48) print $0}' grade.txt P.Bunny 02/99 48 green 12 35 28 [root@localhost opt]# awk '{if($4 !~ /Brown/) print $0}' grade.txt M.Tansley 05/99 48311 Green 8 40 44 J.Lulu 06/99 48317 green 9 24 26 P.Bunny 02/99 48 green 12 35 28 [root@localhost opt]# awk '{if($6<$7) print $0 "$1 try better at the next comp"}' grade.txt M.Tansley 05/99 48311 Green 8 40 44$1 try better at the next comp J.Lulu 06/99 48317 green 9 24 26$1 try better at the next comp [root@localhost opt]# awk '{if($6<=$7) print $1}' grade.txt M.Tansley J.Lulu J.Troll [root@localhost opt]# awk '{if($6>$7) print $1}' grade.txt P.Bunny L.Tansley [root@localhost opt]# awk '{if($0 ~/[Gg]reen/) print $0 }' grade.txt M.Tansley 05/99 48311 Green 8 40 44 J.Lulu 06/99 48317 green 9 24 26 P.Bunny 02/99 48 green 12 35 28 [root@localhost opt]# awk '{if($1 ~/^...a/) print $0}' grade.txt M.Tansley 05/99 48311 Green 8 40 44 L.Tansley 05/99 4712 Brown-2 12 30 28 [root@localhost opt]# awk '$1 ~/^...a/' grade.txt M.Tansley 05/99 48311 Green 8 40 44 L.Tansley 05/99 4712 Brown-2 12 30 28 [root@localhost opt]# awk '{if ($0 ~/(Yellow|Brown)/) print $0}' grade.txt J.Troll 07/99 4842 Brown-3 12 26 26 L.Tansley 05/99 4712 Brown-2 12 30 28 [root@localhost opt]# awk '/^P/' grade.txt P.Bunny 02/99 48 green 12 35 28 [root@localhost opt]# awk '{if ($1=="P.Bunny" && $4=="Yellow")print $0}' grade.txt [root@localhost opt]# awk '{if ($4 ~/Brown/ || $4=="Yellow")print $0}' grade.txt J.Troll 07/99 4842 Brown-3 12 26 26 L.Tansley 05/99 4712 Brown-2 12 30 28 [root@localhost opt]# awk 'END{print NR}' grade.txt 5 [root@localhost opt]# cat -n grade.txt 1 M.Tansley 05/99 48311 Green 8 40 44 2 J.Lulu 06/99 48317 green 9 24 26 3 P.Bunny 02/99 48 green 12 35 28 4 J.Troll 07/99 4842 Brown-3 12 26 26 5 L.Tansley 05/99 4712 Brown-2 12 30 28 [root@localhost opt]# awk '{print NF,NR,$0}END{print FILENAME}' grade.txt 7 1 M.Tansley 05/99 48311 Green 8 40 44 7 2 J.Lulu 06/99 48317 green 9 24 26 7 3 P.Bunny 02/99 48 green 12 35 28 7 4 J.Troll 07/99 4842 Brown-3 12 26 26 7 5 L.Tansley 05/99 4712 Brown-2 12 30 28 grade.txt [root@localhost opt]# awk '{if (NR>0 && $4 ~/Brown/) print $0}' grade.txt J.Troll 07/99 4842 Brown-3 12 26 26 L.Tansley 05/99 4712 Brown-2 12 30 28 [root@localhost opt]# echo "/usr/local/etc/rc.sybase" | awk -F"/" '{print $NF}' rc.sybase [root@localhost opt]# awk '{name=$1;belts=$4;if(belts ~/Yellow/) print name "is belt" belts}' grade.txt P.Bunnyis beltYellow [root@localhost opt]# awk '{if($6<27)print $0}' grade.txt J.Lulu 06/99 48317 green 9 24 26 J.Troll 07/99 4842 Brown-3 12 26 26 [root@localhost opt]# awk 'BEGIN {BASELINE="27"}{if($61{if(x==$1){if($3>z){$3=$3-z}else{$3=z-$3;$2=y}}else{print x,y,z}}{x=$1;y=$2;z=$3}' file a001 2 600 a002 1 400 ############### vim infile t lines init a'101-1 ' b 6 20.00 15.00 '101-1 15.056 0 2 ' 15.056 0 0 path=no 12275 dwt=#.00 ttf=4 7604 9691 dwt=.50 12512 dwt=#.00 9692 12511 6374 6373 7602 dwt=.50 7905 dwt=#.00 7906 9681 需要达到的效果是:凡事以字母开头的比如t lines init a'101-1 '都原封不动的print出来 然后,凡是本行内含有dwt=#0.00的,该行的下一行中的数字+100000 1 [root@master opt]# awk '/dwt=#.00/{print;getline;printf "%9s\n" , $NF+100000;next}1' infile 2 awk '/dwt=#.00/{print;getline;$1+=100000}1' infile ==================================================================================================== [root@L ~]# cat testfile lehih_0006->lehih_0004 teyou_0013->teyou_0001 teyou_0014->teyou_0001 teyou_0016->teyou_0001 teyou_0017->teyou_0002 teyou_0019->teyou_0002 teyou_0018->teyou_0002 以 "->"为FS 如何把第一个字段的内容放入一个awk数组中? 或者说 如何往awk数组中添加元素? [root@master opt]# awk -F"->" '{a[NR]=$1}END{for(i in a)print a[i]}' tfile teyou_0016 teyou_0017 teyou_0019 teyou_0018 lehih_0006 teyou_0013 teyou_0014 ----------------------------------------------------------- 统计文件中个字符或字符串个数 [root@L ~]# cat file A B C S C D E A B S D A D B S A E S C D S A B D 1 awk '{for(i=1;i<=NF;i++)array[$i]++} END{for(k in array)printf("%s\t%d\n",k,array[k])}' file A 5 B 4 C 3 D 5 E 2 S 5 2 [root@master opt]# awk '{for(i=1;i<=NF;i++)array[$i]++} END{for(k in array)print(k,array[k])}' file1 A 5 B 4 C 3 D 5 E 2 S 5 --------------------------------------------------------------------------------------------- &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 1.txt 1 4 2 39 3 58 2.txt 1 34 2 76 3 60 现在我想要的结果是: 1 4 34 2 39 76 3 58 60 [root@master opt]# awk 'FNR==NR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 2.txt 1.txt 1 4 34 2 39 76 3 58 60 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文件内容如下: # 1 2 3 # 4 5 # 6 7 8 9 # 想要的结果如下: 123 45 6789 [root@master opt]# awk -vRS=# -vOFS= 'NF+=0' awk 123 45 6789 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 打印文件的第二列到最后一列 [root@master opt]# cat grade.txt M.Tans 5/99 48311 Green 8 40 44 J.Lulu 06/99 48317 green 9 24 26 P.Bunny 02/99 48 Yellow 12 35 28 J.Troll 07/99 4842 Brown-3 12 26 26 L.Tansl 05/99 4712 Brown-2 12 30 28 [root@master opt]# awk '{for(i=2;i<=7;i++)printf ($i"\t");printf("\n")}' grade.txt 5/99 48311 Green 8 40 44 06/99 48317 green 9 24 26 02/99 48 Yellow 12 35 28 07/99 4842 Brown-3 12 26 26 05/99 4712 Brown-2 12 30 28 [root@master opt]# awk '{for(i=2;i<=NF;i++)printf ($i"\t");printf("\n")}' grade.txt 5/99 48311 Green 8 40 44 06/99 48317 green 9 24 26 02/99 48 Yellow 12 35 28 07/99 4842 Brown-3 12 26 26 05/99 4712 Brown-2 12 30 28 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 我想用shell 提取字符串中的数据,原始数据如下 提取后呈现 key 201112/27/C.QhlYzQ44tTHDccKeQ tag 0 key 201112/27/C.QhlYzQ44tTHDccKeC tag 1 key 201112/27/C.QhlYzQ44tTHDccKeW tag 2 key 201112/27/C.QhlYzQ44tTHDccKeU tag 3 [root@master opt]# awk '{s=$3" "$4;gsub(/=|\"/," ",s);print s}' data key 201112/27/C.QhlYzQ44tTHDccKeQ tag 0 key 201112/27/C.QhlYzQ44tTHDccKeC tag 1 key 201112/27/C.QhlYzQ44tTHDccKeW tag 2 key 201112/27/C.QhlYzQ44tTHDccKeU tag 3 [root@master opt]# awk -F "[=\" ]+" '{print $4,$5,$6,$7}' data key 201112/27/C.QhlYzQ44tTHDccKeQ tag 0 key 201112/27/C.QhlYzQ44tTHDccKeC tag 1 key 201112/27/C.QhlYzQ44tTHDccKeW tag 2 key 201112/27/C.QhlYzQ44tTHDccKeU tag 3 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( temp.dat 130 2008 2223.08 0.2814 200805092200 79200 20070815032657 133 2008 2184.69 0.5009 200805121400 50400 20071226232905 133 2008 1359.88 0.2354 200805122000 72000 20081105042440 122 2008 2480.08 0.2035 200805010100 3600 20090102084023 133 2008 1828.50 0.2576 200805122000 72000 20090105025641 只输出奇数行 [root@master opt]# awk '{print $0;getline}' temp.dat 130 2008 133 2008 133 2008 122 2008 133 2008 [root@client1 ~]# seq 10 | awk 'i=!(i++)' 1 3 5 7 9 [root@client1 ~]# seq 10 | awk 'i++%2' 2 4 6 8 10 [root@client ~]# seq 10| awk '{getline;print $0}' 2 4 6 8 10 seq 100 | awk 'i=!i' 这条命令能显示1到100之间的奇数,看了不理解,求解释 只输出偶数行 [root@master opt]# awk '{getline;print $0}' temp.dat 2223.08 0.2814 200805092200 79200 20070815032657 2184.69 0.5009 200805121400 50400 20071226232905 1359.88 0.2354 200805122000 72000 20081105042440 2480.08 0.2035 200805010100 3600 20090102084023 1828.50 0.2576 200805122000 72000 20090105025641 [root@master opt]# awk 'i++%2' temp.dat 2223.08 0.2814 200805092200 79200 20070815032657 2184.69 0.5009 200805121400 50400 20071226232905 1359.88 0.2354 200805122000 72000 20081105042440 2480.08 0.2035 200805010100 3600 20090102084023 1828.50 0.2576 200805122000 72000 20090105025641 是我说的不太清楚,我想利用奇数行的第一列,和偶数行,最终一奇一偶两行输出一行 [root@master opt]# awk '{printf NR%2?$1 FS :$0 RS}' temp.dat 130 2223.08 0.2814 200805092200 79200 20070815032657 133 2184.69 0.5009 200805121400 50400 20071226232905 133 1359.88 0.2354 200805122000 72000 20081105042440 122 2480.08 0.2035 200805010100 3600 20090102084023 133 1828.50 0.2576 200805122000 72000 20090105025641 ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( =================================================================== 有文件,比如 a b c d e f g 复制代码 现在要生成如下 a,b,c,d,e,f,g 复制代码 我现在 [root@nagios ~]# awk 'BEGIN{ORS=","}{print $0}' test a,b,c,d,e,f,g, [root@master opt]# awk 'BEGIN{RS="";OFS=","}NF+=0' ta a,b,c,d,e,f,g [root@master opt]# awk -vOFS="," -vRS="" 'NF+=0' ta a,b,c,d,e,f,g ==================================================================== .................................................................... 文本: hash:0af1403ac9021973529b723cf9479633 date:7.6.0.2001 hash:0af1403ac9021973529b723cf9479633 date:7.6.0.2001 hash:f80cf7f9629c91aaa899e2256a6b4dac date:7.6.0.2001 hash:f80cf7f9629c91aaa899e2256a6b4dac date:7.6.0.2001 hash:f80cf7f9629c91aaa899e2256a6b4dac date:7.6.0.2001 hash:f80cf7f9629c91aaa899e2256a6b4dac date:7.6.0.2001 hash:f80cf7f9629c91aaa899e2256a6b4dac date:7.6.0.2001 hash:f80cf7f9629c91aaa899e2256a6b4dac date:7.6.0.2001 hash:f80cf7f9629c91aaa899e2256a6b4dac date:7.6.0.2001 hash:f80cf7f9629c91aaa899e2256a6b4dac date:7.6.0.2009 根据date统计hash的个数,重复的只算一个,得到结果: 7.6.0.2001 2 7.6.0.2009 1 awk -F"[ :]" '!a[$2,$NF]++{b[$NF]++}END{for(i in b)print i,b[i]}' file .................................................................... ************************************************ 记录平时需要用到的awk命令1 ) 删除空行 1 awk NF 2 awk '!/^$/' 去掉重复行 awk '!a[$1]++' 去除第一列重复行 -----------? str=" 1 2 3 4 5 6 7 8 9 " 打印成如下格式: 1 2 3 4 5 6 7 8 9 [root@master opt]# echo "11_22_33_44_55_66_77_88"_99|awk -vRS="_" 'ORS=NR%3?" ":"\n"' 11 22 33 44 55 66 77 88 99 [root@master opt]# echo "1 2 3 4 5 6 7 8 9"|awk -vRS=" " 'ORS=NR%3?" ":"\n"' 1 2 3 4 5 6 7 8 9 -----------? >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [root@master opt]# cat atest a,b,c,d e,f,g,h i,j,k,l [root@master opt]# awk -vRS="[,\n]" 'NF+=0' atest a b c d e f g h i j k l [root@master opt]# cat a1 a,b,c,d,e,f,g,h,i,j,k [root@master opt]# awk -vRS="," 'NF+=0' a1 a b c d e f g h i j k >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< etstat 监控端口查出的状态进行IP 和状态的统计,并排序 tcp 0 0 127.0.0.1:31001 10.156.177.88:3391 TIME_WAIT tcp 0 0 127.0.0.1:31001 10.165.176.249:1702 TIME_WAIT tcp 0 0 127.0.0.1:31001 10.113.179.124:2805 TIME_WAIT tcp 0 0 127.0.0.1:31001 10.111.178.157:1292 ESTABLISHED tcp 0 0 127.0.0.1:31001 10.38.178.189:1380 TIME_WAIT 期望得到的结果为: ip(第五列) 状态 出现次数 10.156.177.88 TIME_WAIT 1 [root@master opt]# cat file3 tcp 0 0 127.0.0.1:31001 10.156.177.88:3391 TIME_WAIT tcp 0 0 127.0.0.1:31001 10.165.176.249:1702 TIME_WAIT tcp 0 0 127.0.0.1:31001 10.113.179.124:2805 TIME_WAIT tcp 0 0 127.0.0.1:31001 10.111.178.157:1292 ESTABLISHED tcp 0 0 127.0.0.1:31001 10.38.178.189:1380 TIME_WAIT [root@master opt]# awk '{split($5,a,":");b[a[1]" "$6]++}END{for(i in b)print i,b[i]}' file3 10.38.178.189 TIME_WAIT 1 10.113.179.124 TIME_WAIT 1 10.165.176.249 TIME_WAIT 1 10.156.177.88 TIME_WAIT 1 10.111.178.157 ESTABLISHED 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 统计没歌词出现的次数 [root@master opt]# cat word data we me and you data we me and you data we me and you data we me and you data we me and you data we me and you [root@master opt]# awk '{for(i=1;i<=NF;i++)a[$i]++}END{for(i in a)print i,a[i]}' word me 6 data 6 and 6 you 6 we 6 MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 实现如下格式 [root@client1 html]# echo "1,2,3,4,5,6"|awk -F "," '{for(i=2;i<=NF;i++) print $1","$i}' 1,2 1,3 1,4 1,5 1,6 ?: 运算符解释 条件成立取?后面的值 即条件为真 为假取:后面的值 0为假,则!0即为真 [gaoming@localhost ~]$ awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' ok 文件内容如下 [root@client1 tmp]# cat b.txt 20121001 testing 20121001 test.192.168.0.1 20121001 time:20 实现格式如下 20121001 192.168.0.1,20 [root@client1 tmp]# cat b.txt | awk 'NR>1{a[$1]=a[$1]? a[$1]"," $2:$2}END{for (i in a)print i,a[i]}' | sed 's/[a-z]//g' 20121001 .192.168.0.1,:20 awk '{sub(/[^0-9]+/,"",$2);if($2~/[0-9]/)a[$1]=a[$1]?a[$1]", "$2:$2}END{for(i in a)print i,a[i]}' file 解释贴经典啊 http://bbs.chinaunix-/thread-3769891-2-12.html [root@test ~]# cat a.log 1 a 1 b 2 c 2 d 2 e 3 f [root@test ~]# cat a.log |awk '{a[$1]=a[$1] ?a[$1]","$2:$2}END{for(i in a)print i,a}' 1 a,b 2 c,d,e 3 f 判断是对 a[$1]的判断,而不是 a[$1]=a[$1]的判断。 01.第一行时, a[$1]为空为假,所以, 执行a[$1]=a[$1]?a[$1] "," $2:$2 后, a[$1]为$2, 即a[1]=a. 02. 03.第二行时,a[$1]不为空为真,所以,执行a[$1]=a[$1]?a[$1] "," $2:$2 后, a[$1]为原来的a[$1] “," $2,即a[1]为 a,b 如题http://bbs.chinaunix-/thread-3763442-1-22.html A:name B:number C:123456 D:654321 E: 0721 00:00:00 [ :]匹配空格或: + 匹配前面的子表达式 1 次或多次 [root@client1 tmp]# awk -F '[ :]+' '{print $2}' eg name number 123456 654321 如题http://bbs.chinaunix-/thread-3760162-1-26.html -rw-a-- 2.0 fat 3156 b- defN 11-Jul-12 11:11 WEB-INF/classes/com/channelsoft/helpdesk/business/action/CallUpSgAction.class -rw-a-- 2.0 fat 8632 b- defN 11-Jul-12 10:59 WEB-INF/classes/com/channelsoft/helpdesk/business/util/SGClient.class -rw-a-- 2.0 fat 16720 t- defN 11-Jul-12 10:26 WEB-INF/classes/struts-business.xml -rw-a-- 2.0 fat 4 t- stor 11-Jul-12 11:54 svn_version.txt 如上信息 可以将上面信息当成file awk 怎么能获取这样的结果: CallUpSgAction.class SGClient.class struts-business.xml svn_version.txt 也就是说,获取每一行最后的那个文件名? [root@client1 tmp]# awk -F"[ /]" '{print $NF}' file1 CallUpSgAction.class SGClient.class struts-business.xml svn_version.txt http://bbs.chinaunix-/thread-1679416-1-30.html [root@localhost test]# cat t1 a 1 b 45 c 90089809 d dsd [root@localhost test]# awk '{printf "%s",$1}' t1 abcd 如题 得到如下结果 [root@client1 tmp]# cat port port,0 mac,0017.0850.1530,ip-address,192.168.0.199 port,1 mac,0011.2557.972F,ip-address,192.168.0.166 port,2 mac,4016.9F0C.BB39,ip-address,192.168.0.25 mac,0013.02A3.F918,ip-address,192.168.0.27 mac,CC52.AF28.D6EC,ip-address,192.168.0.74 [root@client1 tmp]# awk '/^port,/{p=$0;next}{print $0","p}' port mac,0017.0850.1530,ip-address,192.168.0.199,port,0 mac,0011.2557.972F,ip-address,192.168.0.166,port,1 mac,4016.9F0C.BB39,ip-address,192.168.0.25,port,2 mac,0013.02A3.F918,ip-address,192.168.0.27,port,2 mac,CC52.AF28.D6EC,ip-address,192.168.0.74,port,2 http://bbs.chinaunix-/thread-3705860-1-62.html
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~