如何在linux shell中使用regexp提取文本部分?假设我有一个文件,其中每一行都有一个IP地址,但位置不同。使用常用unix命令行工具提取这些IP地址的最简单方法是什么?
发布于 2009-01-09 13:11:28
您可以使用grep将它们提取出来。
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file.txt
发布于 2009-01-09 13:46:53
这里的大多数示例都将匹配999.999.999.999,从技术上讲,这不是一个有效的IP地址。
以下内容将仅匹配有效的IP地址(包括网络和广播地址)。
grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt
如果要查看匹配的整个行,请省略-o。
发布于 2009-01-09 13:35:49
我通常从grep开始,以获得正确的regexp。
# [multiple failed attempts here]
grep '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' file # good?
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' file # good enough
然后,我会尝试将其转换为sed
,以过滤掉该行的其余部分。(读完这篇文章后,你和我不会再这样做了:我们将使用grep -o
。)
sed -ne 's/.*\([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\).*/\1/p # FAIL
这就是我通常对sed
不像其他人一样使用相同的正则表达式而感到恼火的时候。所以我搬到了perl
。
$ perl -nle '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ and print $&'
无论如何,Perl都很高兴知道这一点。如果您安装了少量的CPAN,您甚至可以以很少的成本使其更加可靠:
$ perl -MRegexp::Common=net -nE '/$RE{net}{IPV4}/ and say $&' file(s)
https://stackoverflow.com/questions/427979
复制相似问题