你如何在Linux外壳使用正则表达式从文件中提取IP地址?你如何在Linux外壳使用正则表达式从文件

2019-05-13 08:23发布

如何提取在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:

我已经尝试了所有的答案,但他们都不得不说我列出几条他们中的一个或多个问题。

  1. 有些检测123.456.789.111为有效IP
  2. 有些不检测127.0.00.1为有效IP
  3. 有些人不检测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

尼斯法禁止黑客攻击。 接下来,您可以:

  1. 删除线,不到20次
  2. 使用正则表达式切,直到空单,所以你将只有IP地址
  3. 使用正则表达式切1-3 IP地址的最后一个号码,你将有唯一的网络地址
  4. 添加deny from ,并在每一行开头的空间
  5. 把结果文件的.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}'



文章来源: How do you extract IP addresses from files using a regex in a linux shell?