一直觉得要达到在shell中随意匹配、提取任何指定范围的字符串,是需要很深的功夫才能做到的。
(注意,只要匹配到的内容而不要同在一行的任何其他无关的内容)
以前时间过的,多是
grep -E -o(缺点是一次只能匹配输出一个模式或者分组,多个非连续的模式匹配则不行),
cut -d" " -f 2,
tr -s "\n" " ",
awk '{ $1 ~ /os_v/}' (缺点是很多时候你根本不知道哪个域的内容符合你的匹配模式)
这些都是想尽办法找出输入流的规律才能采取相应的措施。
现在终于有了万能的瑞士军刀!
awk使用match匹配并分组保存到数组中。多个不同的分组需要不同的数组来保存哦。
如果一行出现多个ip,你会发现始终只匹配到第一个哦,要自己想办法哦!
[Administrator@RobertNote@/g/WorkDocs/jianwenlog/20170719@14:55:43]
2727 $ awk '{match($0,/(ip"[^,]*,)/,a);print a[1]}' 3235_click_20170719_export.txt
ip":"221.122.83.166",
ip":"221.122.83.166",
ip":"123.116.51.146",
sed匹配没有问题,但是默认会显示一行中所有内容,所以难的是你需要知道保存分组并且只显示你想要的分组。下面就是使用替换一整行为分组一来达到目的的。
[Administrator@RobertNote@/g/WorkDocs/jianwenlog/20170719@14:55:59]
2728 $ sed 's/.*\(ip"[^,]*,\).*/\1/' 3235_click_20170719_export.txt
ip":"221.122.83.166",
ip":"221.122.83.166",
ip":"123.116.51.146",