首页 > 解决方案 > 在 linux shell 中使用正则表达式从文本文件中提取字符串、grep IP 地址但使用 CIDR 排除子网

问题描述

我需要解析一个包含多行 IP 信息的文本文件,但我想提取 IP 地址,但使用 grep 和正则表达式排除带有 CIDR 的子网。

示例文本行:

Removed host entry 10.43.160.72 @10.43.160.64/26-> esjc-test-sr90p
Removed host entry 10.26.232.157 @10.26.232.0/22-> esjc-test-sr90p

期望的输出:

10.43.160.72
10.26.232.157

目前我正在使用:

grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" test

但这也包括我想避免的子网信息。

谢谢!

标签: regexshellawkgrep

解决方案


第一种解决方案:使用您显示的示例,您能否尝试以下操作。用 GNU 编写和测试grep

grep -E -o '([0-9]{1,3}[\.]){3}[0-9]{1,3}(\s|$)' Input_file | cut -d' ' -f1


第二种解决方案:如果您可以接受awk,请尝试以下操作。

awk '{for(i=1;i<=NF;i++){if($i~/^([0-9]+\.){3}[0-9]+$/){print $i}}}' Input_file

或使用 OP 使用的正则表达式(稍加调整)尝试以下操作:

awk '{for(i=1;i<=NF;i++){if($i~/^(([0-9]{1,3})\.){3}[0-9]{1,3}$/){print $i}}}' Input_file

推荐阅读