如何提取在Linux shell中通过正则表达式文本的一部分? 比方说,我有一个文件,其中每行是一个IP地址,但在不同的位置。 什么是提取使用常见的Unix命令行工具的IP地址最简单的方法?
Answer 1:
你可以使用grep的拉出来。
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file.txt
Answer 2:
这里的大多数例子将匹配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。
Answer 3:
我通常使用grep开始,以获得正则表达式正确。
# [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)
Answer 4:
这工作得很好,我在访问日志。
cat access_log | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'
让我们来分析各部分进行说明。
[0-9]{1,3}
是指一至三个出现在[]中提及的范围之外。 在这种情况下,0-9。 所以它匹配像10或183的图案。其次是一个“”。 我们需要摆脱这种作为“” 是元字符,并有壳特殊的意义。
所以,现在我们是在像“123”模式 '12“。 等等
此模式重复本身三次(与“”)。 因此,我们将其括在括号中。
([0-9]{1,3}\.){3}
最后是模式重演,但这次没有了“”。 这就是为什么我们在第3步分开存放它。
[0-9]{1,3}
如果IP地址是在每行作为我的情况下使用的开头:
egrep -o '^([0-9]{1,3}\.){3}[0-9]{1,3}'
其中,“^”是讲述在一行的开始搜索锚。
Answer 5:
我写了一个小剧本 ,看我的日志文件更好,这没什么特别的,但可能有很大的帮助谁正在学习Perl的人。 它还对IP地址的DNS查找它提取他们之后。
Answer 6:
我写了一篇关于这个话题的信息博客文章: 如何提取从纯文本IPv4和IPv6的IP地址使用正则表达式 。
在这篇文章中有最常见的形态各异的IP地址的详细指南,往往需要提取和使用正则表达式的纯文本隔离。
该指南是基于CodVerter的IP提取处理IP地址的提取和检测,必要时源代码的工具。
如果你想验证和获取IPv4地址这种模式可以做的工作:
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
或验证和获取IPv4地址前缀 (“斜杠符号”):
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?/[0-9]{1,2})\b
或者捕捉子网掩码或通配符掩码:
(255|254|252|248|240|224|192|128|0)[.](255|254|252|248|240|224|192|128|0)[.](255|254|252|248|240|224|192|128|0)[.](255|254|252|248|240|224|192|128|0)
或者过滤掉你用正则表达式做子网掩码地址负前瞻 :
\b((?!(255|254|252|248|240|224|192|128|0)[.](255|254|252|248|240|224|192|128|0)[.](255|254|252|248|240|224|192|128|0)[.](255|254|252|248|240|224|192|128|0)))(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
对于IPv6验证你可以去我在这个答案的上方添加了文章链接。
这里是捕捉所有的常见模式(从CodVerter`s IP提取样品帮助拍摄)的例子:
如果你愿意,你可以测试IPv4的正则表达式在这里 。
Answer 7:
你可以使用一些辅助性壳我做: https://github.com/philpraxis/ipextract
包括他们在这里为方便起见:
#!/bin/sh
ipextract ()
{
egrep --only-matching -E '(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]?)'
}
ipextractnet ()
{
egrep --only-matching -E '(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]?)/[[:digit:]]+'
}
ipextracttcp ()
{
egrep --only-matching -E '[[:digit:]]+/tcp'
}
ipextractudp ()
{
egrep --only-matching -E '[[:digit:]]+/udp'
}
ipextractsctp ()
{
egrep --only-matching -E '[[:digit:]]+/sctp'
}
ipextractfqdn ()
{
egrep --only-matching -E '[a-zA-Z0-9]+[a-zA-Z0-9\-\.]*\.[a-zA-Z]{2,}'
}
从壳加载/源它(存储在ipextract文件时):
$。 ipextract
使用它们:
$ ipextract < /etc/hosts
127.0.0.1
255.255.255.255
$
对于实际使用的一些例子:
ipextractfqdn < /var/log/snort/alert | sort -u
dmesg | ipextractudp
Answer 8:
握-E -o “([0-9] {1,3} []){3} [0-9] {1,3}”
Answer 9:
您可以使用SED 。 但是,如果你了解Perl,这可能是更容易,更有效,从长远来看就知道:
perl -n '/(\d+\.\d+\.\d+\.\d+)/ && print "$1\n"' < file
Answer 10:
我建议的Perl。 (\ d + \ d + \ d + \ d +)或许应该做的伎俩。
编辑:只是为了使它更像一个完整的程序,你可以不喜欢以下(未测试):
#!/usr/bin/perl -w
use strict;
while (<>) {
if (/(\d+\.\d+\.\d+\.\d+)/) {
print "$1\n";
}
}
这种处理每行一个IP。 如果你有每行一个以上的IP地址,您需要使用/ g的选项。 男人perlretut为您提供了正则表达式的更详细的教程。
Answer 11:
你可以用awk,以及。 就像是 ...
我++;}而(I'= NF);}”文件
- 可能需要清洁。 只是一个快速和肮脏的反应基本上展示了如何使用awk做
Answer 12:
以前所有的答案有一个或多个问题。 该接受的答案让像999.999.999.999 IP号码。 目前第二个最upvoted回答需要用前缀为127.000.000.001或008.008.008.008,而不是127.0.0.1或8.8.8.8如0。 Apama有它差不多吧,但表达要求ipnumber就行,没有前导或尾随允许空间的唯一的事情,也不能从行中间选择IP的。
我认为,正确的正则表达式上可以找到http://www.regextester.com/22
所以,如果你想提取从文件中使用的所有IP-不会忽略:
grep -Eo "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" file.txt
如果你不想重复使用:
grep -Eo "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" file.txt | sort | uniq
请评论,如果仍然有在此正则表达式的问题。 它很容易找到很多错误的正则表达式对于这个问题,我希望这其中有没有真正的问题。
Answer 13:
在这里大家都在用很长的手正则表达式,但实际上了解POSIX的正则表达式可以让你使用一个小grep
命令,这样打印的IP地址。
grep -Eo "(([0-9]{1,3})\.){3}([0-9]{1,3})"
(附注)这不忽略无效的IP地址,但它是非常简单的。
Answer 14:
我已经尝试了所有的答案,但他们都不得不说我列出几条他们中的一个或多个问题。
- 有些检测
123.456.789.111
为有效IP - 有些不检测
127.0.00.1
为有效IP - 有些人不检测IP与零象开始
08.8.8.8
所以我在这里张贴在所有上述条件工作的正则表达式。
注:我已经提取超过200万IP,而不具有以下的正则表达式任何问题。
(?:(?:1\d\d|2[0-5][0-5]|2[0-4]\d|0?[1-9]\d|0?0?\d)\.){3}(?:1\d\d|2[0-5][0-5]|2[0-4]\d|0?[1-9]\d|0?0?\d)
Answer 15:
对于那些谁想要一个现成的解决方案,从Apache日志获取IP地址,并列出了多少次IP地址访问的网站的出现次数,使用这行:
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' error.log | sort | uniq -c | sort -nr > occurences.txt
尼斯法禁止黑客攻击。 接下来,您可以:
- 删除线,不到20次
- 使用正则表达式切,直到空单,所以你将只有IP地址
- 使用正则表达式切1-3 IP地址的最后一个号码,你将有唯一的网络地址
- 添加
deny from
,并在每一行开头的空间 - 把结果文件的.htaccess
Answer 16:
如果您没有给出一个特定的文件,你需要提取的IP地址,我们需要递归做到这一点。 grep命令 - >检索一个文本或文件对于给定的字符串匹配并显示匹配的字符串。
握-roE '[0-9] {1,3} [0-9] {1,3} [0-9] {1,3} [0-9] {1,3}。' | 握 - 噢 '[0-9] {1,3}。[0-9] {1,3}。[0-9] {1,3}。[0-9] {1,3}'
-r - >我们可以搜索即当前目录下的整个目录树和子目录的各个层面。 它表示递归搜索。
-o - >只打印匹配的字符串
-E - >使用扩展正则表达式
如果我们是不会用第二个grep命令管道后,我们会与路径相处的IP地址在那里存在
Answer 17:
cat ip_address.txt | grep '^[0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[,].*$\|^.*[,][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[,].*$\|^.*[,][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}$'
让我们假设在中间以逗号分隔的文件和IP地址的开始,结束的位置,有的地方
首先正则表达式查找IP地址在该行的开头精确匹配。 第二正则表达式的或查找在middle.we IP地址后,在这样一种方式,随后的数字,应完全1至3位数等12345.12.34.1 .falsy IPS可以被排除在本是匹配的。
第三正则表达式查找IP地址,在该行的末尾
Answer 18:
对于centos6.3
ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | awk 'BEGIN {FS=":"} {print $2}'