在shell中提取文件每一行的IP地址

在shell中提取文件每一行的IP地址

我在 ubuntu 中有这个输入文件:

146.14.142.96.17747 197.102.40.184.13748:
146.14.142.96.17747 197.102.40.184.13749: 
146.14.142.96.17747 197.102.40.184.13750:
146.114.142.96.17747 197.102.40.184.13751:
46.14.142.96.17747 197.102.40.184.13752:

并且我希望使用 shell 脚本获得如下输出:

分隔两个 IP,不带端口号,即删除端口

146.14.142.96 197.102.40.184
146.14.142.96 197.102.40.184 
146.14.142.96 197.102.40.184
146.114.142.96 197.102.40.184
46.14.142.96 197.102.40.184

答案1

对于格式与问题中所示完全一致的行,可以这样做:

sed -E 's/\.[0-9]+[ :]/ /g' input-file

怎么运行的:

  • -E使扩展正则表达式

  • s/SEARCH/REPLACE/g全局 ( /g) 替换 (s/ )搜索代替

  • \.[0-9]+[ :]匹配空格或冒号后任意正数位数字后面的点。

但是,只要格式稍有变化,这种方法就会失效。这种方法可能会更稳健:

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

怎么运行的:

  • ([0-9]+\.){3}[0-9]+匹配一个 IP(三位数字组后跟点加上一个额外的数字组)。

  • 周围的括号将前一个匹配声明为第一个子匹配(\1)。

  • [^ ]+匹配 IP 后面的任何非空格字符。

答案2

使用正则表达式进行搜索和替换

(\d+\.\d+\.\d+\.\d+)\.\d+(:?)

并替换文本

\1

各种工具都支持正则表达式搜索和替换,尽管方言可能略有不同。以上适用于 Notepad++。

或者在 vim 中你可以这样做

:s/\(\d\+\.\d\+\.\d\+\.\d\+\)\.\d\+\(:\?\)/\1/g

相关内容