awk一个小例子!

回复 收藏
本帖最后由 定海偶然 于 2015-7-1 20:36 编辑

[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $0}'          $0代表着整行
---1:----2
[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $1}'          $1为什么是空行?

[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $2}'          $2怎么是1?
1
[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $3}'          $3怎么是2?
2
[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $4}'          $4怎么又是空?

----------------------------------------------------------------------------------------------------------
提示:awk -F 后面跟分隔符‘[空格:]+’,其中[空格多分隔符写法,意思是以空格或冒号做分隔,后面的"+"号是正则表达式,意思是匹配前面空格或冒号,两者之一的1个或1个以上。

2015-07-01 20:35 举报
已邀请:
0

定海偶然

赞同来自:

本帖最后由 定海偶然 于 2015-7-2 08:57 编辑

沙发自己坐
0

九月微寒

赞同来自:

你是已-和:做的分割, 开头的-前面是空, 所以$1是空 。 后面的顺序降阶。
0

xiaotuanyu120

赞同来自:

关键在于给---1:----2如何分段,和对awk外部参数$0$1......的理解
0

定海偶然

赞同来自:

xiaotuanyu120 发表于 2015-7-2 08:35
关键在于给---1:----2如何分段,和对awk外部参数$0$1......的理解

哎呀,师兄也来了,好荣幸呐{:4_107:}
0

定海偶然

赞同来自:


[root@localhost1 ~]# echo "a b c 2011-11-22 a:d"
a b c 2011-11-22 a:d
[root@localhost1 ~]# echo "a b c 2011-11-22 a:d" | awk 'sub(/-/,"",$4)' //这里的$4是什么鬼啊?
a b c 201111-22 a:d
[root@localhost1 ~]# echo "a b c 2011-11-22 a:d" | awk 'sub(/-/,"",$0)'  //$0代表着整行,这个好理解!    黄色字部分,是将- 给删除掉!
a b c 201111-22 a:d
[root@localhost1 ~]# echo "a b c 2011-11-22 a:d" | awk 'sub(/-/,"",$1)' //没有输出空行,而是啥都没有?
[root@localhost1 ~]# echo "a b c 2011-11-22 a:d" | awk 'sub(/-/,"",$2)' //没有输出空行,而是啥都没有?
[root@localhost1 ~]# echo "a b c 2011-11-22 a:d" | awk 'sub(/-/,"",$3)' //没有输出空行,而是啥都没有?
[root@localhost1 ~]# echo "a b c 2011-11-22 a:d" | awk 'sub(/-/,"",$4)'
a b c 201111-22 a:d
------------------------------------------------------------------------------------------------
[root@localhost1 ~]# echo "a b c 2011-11-22 a:d" | awk 'gsub(/-/,"",$4)' //sub函数只实现第一个位置的替换,gsub函数实现全局的替换。
a b c 20111122 a:d
0

定海偶然

赞同来自:

本帖最后由 定海偶然 于 2015-7-7 15:46 编辑

[root@localhost1 ~]# awk '{if($0~/.*&..*&...*I.=/){ip=$1;&cga1=$0;sub(/.*g.*.I.=/,"",&c);sub(/&c...*/,"",&cga1);if(&c<=42){sub(/.*&I*..=/,"IMEI=",$0);sub(/&I*..=.*/,"",$0);print ip,$0,&cga1 >> "xurui"}}}'  xurui.new

这是其中的一条日志:
202.69.15.84   30/Jun/2015:00:00:07 +0800     POST /androidplus/?c=plug3&a=request HTTP/1.1        operator=41006&uid=297683399&IMEI=351653062255568&IMSI=410060528425495&counrty=US&language=en&sdcard=true&screenType=480*800*1.5*240&vercode=52&androidVersion=15&androidId=239ee2129ff85ef4&appvercode=2&appPackname=com.playgame.good.tankwars3D&macAddr=08%3AFD%3A0E%3A3C%3AF9%3A84&uuid=00000000-1490-1f98-d1ca-80cc50b0518d&channelId=0000001&gameId=262&cpId=001&promoterId=011&netgame=false&accessTime=-5   Apache-HttpClient/Android


要求提取的信息:日志中的gameId小于等于42的,就把那条日志里面的ip地址和IMEI给提取出来,格式:×.×.×.×  IMEI=××××(注意:前面的4个叉,是ip地址。)
                                                                                                                                                  

至于上面的awk命令,是这条命令[root@localhost1 ~]# awk '{if($0~/&IMEI=.*&gameId=/){ip=$1;line=$0;sub(/.*gameId=/,"",line);sub(/&cpId=.*/,"",line);if(line<=42){sub(/.*&IMEI=/,"IMEI=",$0);sub(/&IMSI=.*/,"",$0);print ip,$0,line >> "result.txt"}}}' file 演变而来的,


第一:/&IMEI=.*&gameId=/  解释:awk里面引用正则,需要前后加上//,里面的.*是正则表示,代表啥,不用我多说了吧。斜杠里面是这段


&IMEI=351653062255568&IMSI=410060528425495&counrty=US&language=en&sdcard=true&screenType=480*800*1.5*240&vercode=52&androidVersion=15&androidId=239ee2129ff85ef4&appvercode=2&appPackname=com.playgame.good.tankwars3D&macAddr=08%3AFD%3A0E%3A3C%3AF9%3A84&uuid=00000000-1490-1f98-d1ca-80cc50b0518d&channelId=0000001&gameId=

第二:if($0~/&IMEI=.*&gameId=/) 解释:if语句代表着,如果一条日志中匹配到这部分(因为其他条日志中没有gameID和IMEI,没有的话,就用if判断后,直接next跳过),就执行下个{}大括号里面的内容。把日志的第一段内容赋值给ip这个变量,把整个语句呢赋值给line这个变量。

第三:这里出现了一个sub关键字:sub匹配第一次出现的符合模式的字符串,相当于 sed 's//'   。
sub(/.*gameId=/,"",line);就是把262前面的所有内容给替换成空,用""这2个替换的,那么line变量就由整行日志变成了262&cpId=001&promoterId=011&netgame=false&accessTime=-5   Apache-HttpClient/Android
看,我们已经把日志切割成这样了,还需要一步

第四:sub(/&cpId=.*/,"",line);就是把262后面的所有的内容给替换成空。line变量就成了262


第五:if(line<=42) 就是判断gameId是不是小于等于42了


第六:第五步成功的话,就执行下个{}大括号里面的内容。依次类推,提取出IMEI的,最终的输出结果


182.185.230.140 IMEI=862120026347909 -1
197.156.77.56 IMEI=358187056465902 -1
27.97.211.83 IMEI=354848063184539 -1
94.101.252.170 IMEI=868801015472576 -1
223.255.225.69 IMEI=355917060092737 -1
5.113.120.127 IMEI=357799050899265 -1
5.116.63.26 IMEI=359703051779011 -1
154.97.218.14 IMEI=355590065934912 -1


PS:附上5000行的日志。
这楼是这个帖子的扩展吧:http://www.apelearn.com/bbs/thread-8180-1-1.html



0

定海偶然

赞同来自:

  1. ------------------------------------------------------------------------------
  2. awk next的使用
  3. text.txt文本内容是:
  4. a
  5. b
  6. c
  7. d
  8. e
  9. [root@localhost1 ~]# awk 'NR%2==1{next}{print NR,$0;}' text.txt
  10. 2 b
  11. 4 d
  12. [root@localhost1 ~]# awk 'NR%2==1;{next}{print NR,$0;}' text.txt
  13. a
  14. c
  15. e
  16. -----------------------------------------------------------------------------
  17. 文件:text.txt 格式:
  18. web01[192.168.2.100]

  19. httpd            ok
  20. tomcat               ok
  21. sendmail               ok
  22. web02[192.168.2.101]
  23. httpd            ok
  24. postfix               ok
  25. web03[192.168.2.102]
  26. mysqld            ok
  27. httpd               ok

  28. 需要通过awk将输出格式变成:
  29. web01[192.168.2.100]:   httpd            ok
  30. web01[192.168.2.100]:   tomcat               ok
  31. web01[192.168.2.100]:   sendmail               ok
  32. web02[192.168.2.101]:   httpd            ok
  33. web02[192.168.2.101]:   postfix               ok
  34. web03[192.168.2.102]:   mysqld            ok
  35. web03[192.168.2.102]:   httpd               ok

  36. [root@localhost1 ~]# awk '/^web/{T=$0;next;}{print T":\t"$0;}' text1.txt
  37. web01[192.168.2.100]:       
  38. web01[192.168.2.100]:        httpd            ok
  39. web01[192.168.2.100]:        tomcat               ok
  40. web01[192.168.2.100]:        sendmail               ok
  41. web02[192.168.2.101]:        httpd            ok
  42. web02[192.168.2.101]:        postfix               ok
  43. web03[192.168.2.102]:        mysqld            ok
  44. web03[192.168.2.102]:        httpd               ok
  45. web03[192.168.2.102]:       

  46. [root@localhost1 ~]# awk '/^web/{T=$0;next;}{print T":\t"$0  >> "text2.txt" }' text1.txt
  47. [root@localhost1 ~]# vim text2.txt
  48. -----------------------------------------------------------------------------------------------------
  49. A文件:
  50.         韩海林  21岁
  51.         海林韩  23岁
  52.         韩林海  22岁
  53.         林海韩  24岁
  54. B文件:
  55.         韩林海        男
  56.         海林韩  男
  57.         韩海林  男
  58.         林海韩  男

  59. ##awk '{if($0~/21.*/){print $0,"男"}}' file
  60. [root@localhost1 ~]# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1] >>"3"}'  A B 这个是对了

















0

gjc159357

赞同来自:

太凶残了   awk 太强大
0

定海偶然

赞同来自:

gjc159357 发表于 2015-7-9 17:03
太凶残了   awk 太强大

看完了么,觉得awk就凶残,没有别的感受了么?
0

oldorab

赞同来自:

还没有别的练习题?
看你的贴子很有收获
0

oldorab

赞同来自:

能不能说下[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $0}'          $0代表着整行
---1:----2
[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $1}'          $1为什么是空行?

[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $2}'          $2怎么是1?
1
[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $3}'          $3怎么是2?
2
[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $4}'          $4怎么又是空?
是怎么理解的?
0

定海偶然

赞同来自:

oldorab 发表于 2015-8-31 13:31
能不能说下[root@localhost1 ~]# echo ---1:----2|awk -F '[-:]+' '{print $0}'          $0代表着整行
-- ...

好像是因为分隔符导致的,隔的太久了,忘了。。。。。。
0

Neo

赞同来自:

学习了

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: