正则表达式+awk,sed提取任意匹配的内容并输出!

一直觉得要达到在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",

你可能感兴趣的:(正则表达式+awk,sed提取任意匹配的内容并输出!)