【问题标题】:Awk print lines starting with regex (IP address)awk 打印以正则表达式(IP 地址)开头的行
【发布时间】:2016-09-03 11:27:49
【问题描述】:

我正在尝试读取第一列具有 IP 地址的行的文件。

我下面的命令没有返回任何值。

cat test.csv | awk '$1 == "^[[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}]" { print $0 }'

正则表达式可以捕获IP地址。

下面的也试过了,

cat test_1.csv | awk '$1~/^[[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\]/ {print $0}'

test.csv

1.1.1.1 ipaddress gateway
2.2.2.2 ipaddress_2 firewall
www.google.com domain google

【问题讨论】:

  • 使用正则表达式运算符~ 匹配正则表达式。不是==。此外,awk 可以从文件中读取输入。您不需要使用cat。只需awk '$1 ~ /^regex/' file
  • 贴一个输入输出的最小例子。
  • 你为什么要在正则表达式周围加上[...]?这可能无法满足您的期望。
  • @sat 关于== 是正确的,@EricRenouf 关于[...] 是正确的,而且您还缺少最终的}。显然,您应该尝试过更简短的正则表达式,然后构建到那个长的。

标签: linux bash shell awk sed


【解决方案1】:

您可以使用grep 更轻松地做到这一点:

grep -P '^\d+(\.\d+){3}\s' test.csv

grep -P '^\d{1,3}(\.\d{1,3}){3}\s' test.csv

【讨论】:

  • 不确定这是否会过滤 IP 地址,1.1.1.300 怎么样?
  • 使用 grep 并不容易,它只适用于 GNU grep 而awk '$1 ~ /^[0-9]{1,3}(\.[0-9]{1,3}){3}$/' test.csv 将适用于任何 POSIX awk。
【解决方案2】:

当您在 GNU awk 中使用 {1,3}(区间表达式)时,您必须使用 --re-interval(或)--posix 选项来启用它。

使用:

awk --posix '$1 ~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/' file

(或)

awk --re-interval '$1 ~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/' file

来自man awk

r{n,m}

大括号内的一个或两个数字表示一个区间表达式。 区间表达式仅在 --posix--re-interval 在命令行中指定。

【讨论】:

  • 是否有一些设置可以启用这些选项中的一个或两个?在GNU Awk 4.1.3 上没有任何一个选项对我来说工作正常...
  • @spasic,它不适用于GNU Awk 3.1.8。在GNU Awk 4 上,它可能已启用。
  • 哦,好吧.. awk '/^[0-9]{1,3}(\.[0-9]{1,3}){3}\s/' file 有/没有GNU Awk 3.1.8 上的这些选项是否有效?
  • @spasic,它仅适用于 GNU Awk 3.1.8 上的这些选项。
  • 顺便说一句,您的正则表达式缺少结尾 $,可以缩写为 $1 ~ /^[0-9]{1,3}(\.[0-9]{1,3}){3}$/
猜你喜欢
  • 1970-01-01
  • 2017-01-24
  • 2011-06-20
  • 2017-03-15
  • 2015-11-22
  • 2015-03-23
相关资源
最近更新 更多