linux 文本解析 - "select column and remove integer using delimiter"

linux Text parsing - "select column and remove integer using delimiter"

我正在尝试通过 selecting 分隔符删除整数。

我想 select 第 3 和第 4 列并删除“:”分隔符后的端口,我已经尝试了下面的命令。但它按时删除了第一场比赛 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 的工作

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

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

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

直接用sed匹配IP地址,去掉端口即可:

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

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

此模式将匹配每一行中看起来有点像 IP 地址的第一件事(即四个由点分隔的整数),这对于您显示的输入来说不是问题,但需要注意介意。

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

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

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