本帖最后由 定海偶然 于 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个以上。
[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个以上。
0
哎呀,师兄也来了,好荣幸呐{:4_107:}
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
[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
[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
- ------------------------------------------------------------------------------
- awk next的使用
- text.txt文本内容是:
- a
- b
- c
- d
- e
- [root@localhost1 ~]# awk 'NR%2==1{next}{print NR,$0;}' text.txt
- 2 b
- 4 d
- [root@localhost1 ~]# awk 'NR%2==1;{next}{print NR,$0;}' text.txt
- a
- c
- e
- -----------------------------------------------------------------------------
- 文件:text.txt 格式:
- web01[192.168.2.100]
- httpd ok
- tomcat ok
- sendmail ok
- web02[192.168.2.101]
- httpd ok
- postfix ok
- web03[192.168.2.102]
- mysqld ok
- httpd ok
- 需要通过awk将输出格式变成:
- web01[192.168.2.100]: httpd ok
- web01[192.168.2.100]: tomcat ok
- web01[192.168.2.100]: sendmail ok
- web02[192.168.2.101]: httpd ok
- web02[192.168.2.101]: postfix ok
- web03[192.168.2.102]: mysqld ok
- web03[192.168.2.102]: httpd ok
- [root@localhost1 ~]# awk '/^web/{T=$0;next;}{print T":\t"$0;}' text1.txt
- web01[192.168.2.100]:
- web01[192.168.2.100]: httpd ok
- web01[192.168.2.100]: tomcat ok
- web01[192.168.2.100]: sendmail ok
- web02[192.168.2.101]: httpd ok
- web02[192.168.2.101]: postfix ok
- web03[192.168.2.102]: mysqld ok
- web03[192.168.2.102]: httpd ok
- web03[192.168.2.102]:
- [root@localhost1 ~]# awk '/^web/{T=$0;next;}{print T":\t"$0 >> "text2.txt" }' text1.txt
- [root@localhost1 ~]# vim text2.txt
- -----------------------------------------------------------------------------------------------------
- A文件:
- 韩海林 21岁
- 海林韩 23岁
- 韩林海 22岁
- 林海韩 24岁
- B文件:
- 韩林海 男
- 海林韩 男
- 韩海林 男
- 林海韩 男
- ##awk '{if($0~/21.*/){print $0,"男"}}' file
- [root@localhost1 ~]# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1] >>"3"}' A B 这个是对了
0
能不能说下[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怎么又是空?
是怎么理解的?
---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代表着整行
-- ...
好像是因为分隔符导致的,隔的太久了,忘了。。。。。。
编辑回复