【问题标题】:linux Text parsing - "select column and remove integer using delimiter"linux 文本解析 - “选择列并使用分隔符删除整数”
【发布时间】:2016-07-23 05:34:42
【问题描述】:

我正在尝试通过选择分隔符来删除整数。

我想选择第 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 的工作

【问题讨论】:

  • 您的输入和输出不匹配。你自己尝试过什么吗?请edit您的问题来解决这两个问题。
  • 您还从 http: 和 80 之前删除了 :。故意还是错字?
  • 请展示您的编码工作。
  • @karakfa - 抱歉打错了。

标签: awk sed text-parsing


【解决方案1】:

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

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

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

【讨论】:

  • 嗨 Lars,谢谢它的工作...如果您不介意,请分享任何学习 awk 的好链接。
  • @Sasee,称我为老式但我喜欢 Gawk:有效的 AWK 编程,请参阅 gnu.org/software/gawk/manual
【解决方案2】:

只要用sed匹配IP地址,去掉端口即可:

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

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

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

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

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

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

【讨论】:

  • 感谢 Tom 的工作...如果您不介意,请分享任何学习 sed 的好链接...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
相关资源
最近更新 更多