awk系列3--比较全面

网友投稿 548 2022-09-23

awk系列3--比较全面

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小时内删除侵权内容。

    上一篇:河南小程序开发「郑州小程序开发制作公司」
    下一篇:核销小程序开发(开源分销小程序)
    相关文章

     发表评论

    暂时没有评论,来抢沙发吧~