linux文本解析 - “选择列并使用分隔符删除整数”

时间:2016-04-03 18:57:22

标签: awk sed text-parsing

我试图通过选择分隔符来删除整数。

我想选择第3和第4列并删除“:”delimeter之后的端口,我已经尝试了下面的命令。但它会及时删除第一场比赛 00:56:37

sed 's/:/ /'

现在输出,

2016-03-29 00:56:37 0.0.0.0:48130 10.0.1.117:80 404 404 http://52.4.12.23:80/CHANGELOG.txt "Mozilla/5.0 (Windows
2016-03-29 00:57:20 1.1.1.1:37020 10.0.0.197:80 404 404 http://52.4.12.23:80/readme.html "Mozilla/5.0 (Windows
2016-03-29 02:52:46 2.2.2.2:47442 10.0.0.197:80 404 404 http://testp3.pospr.waw.pl:80/testproxy.php "Mozilla/5.0 (Windows

需要输出

2016-03-29 00:56:37 0.0.0.0 10.0.1.117 404 404 http://52.4.12.23:80/CHANGELOG.txt "Mozilla/5.0
2016-03-29 00:57:20 1.1.1.1 10.0.0.197 404 404 http://52.4.12.23:80/readme.html "Mozilla/5.0
2016-03-29 02:52:46 2.2.2.2 10.0.0.197 404 404 http://testp3.pospr.waw.pl:80/testproxy.php "Mozilla/5.0

想要从ip 2.2.2.2:48130 删除端口号为 2.2.2.2 ,但不应影响其他列

请分享您的想法...

感谢Tom和Lars都工作

2 个答案:

答案 0 :(得分:2)

您可以在第三和第四个字段上使用awk及其子函数,如下所示:

awk '{ sub(/:[0-9]+/, "", $3 );sub(/:[0-9]+/, "", $4 ) ; print  }' file

这将从所有行中删除端口号。

答案 1 :(得分:1)

只需使用sed匹配IP地址并删除端口:

sed -E 's/(([0-9]+\.){3}[0-9]+):[0-9]+/\1/;s/(([0-9]+\.){3}[0-9]+):[0-9]+/\1/' file

IP地址匹配并用于替换,丢弃端口。

这个模式将匹配每行看起来模糊地像IP地址的第一件事(即由点分隔的四个整数),这对于您已经显示的输入而言并不是问题,但是要记住这一点。

如果你想在每一行上进行两次替换,那么你也可以这样做:

TZ

如果您使用awk,那么您可以直接定位第三个字段,但您也将重新格式化您触摸的任何行。