如何使用Shell脚本检查文件中是否存在IP地址?


14

我有一个生成一些输出的脚本。我想检查任何IP地址的输出,例如

159.143.23.12
134.12.178.131
124.143.12.132

if (IPs are found in <file>)
then // bunch of actions //
else // bunch of actions //

fgrep个好主意吗?

我有bash可用。


使用grep,egrep,awk或sed,无论您喜欢什么
Ijaz Ahmad Khan

您能帮忙语法吗?我的意思是它如何搜索随机IP。如何描述模式?我会寻找任何IP地址,而不是特定地址。
科苏尔

5
是否只有IPv4地址采用四进制表示法?它们可以写成0010.0000.0000.0001吗?文件是否可能包含类似于IP地址的内容,例如版本号(soft-1.2.1100.1.tar.gz,网络规范(10.0.0.0/24)、1.2.3.4.5)?您会接受对333.444.555.666肯定的解决方案吗?或0377.0377.0377.0377(有效的四进制八进制IP地址)?
斯特凡Chazelas

如果bash有,那么awk通常也可以,所以这可能对您awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'有用:(此单行代码将主机XFR列表的输出转换为/etc/hosts格式。)
Mark Hudson

Answers:


27

是的,您有很多可用的选项/工具。我只是试过了,它有效:

ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

因此,您可以使用grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"grep输出中的IP地址。


谢谢。这可行。你能解释一下吗?这是一个正则表达式吗?
科苏尔

是的,这是bash与grep一起使用的正则表达式,您只是在寻找由点分隔的三位数字模式。您可以通过连续两个数字更改{1,2}中的数字来进行操作,依此类推
Ijaz Ahmad Khan

人们也可以使用它"\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"来查找CIDR(假设它们是有效的)
vikas027 '18

2

根据此答案开始我的答案:

是的,您有很多可用的选项/工具。我只是试过了,它有效:

ifconfig | grep -oE“ \ b([0-9] {1,3}。){3} [0-9] {1,3} \ b” a可以使用grep -oE“ \ b([0- 9] {1,3}。){3} [0-9] {1,3} \ b“从您的输出中grep IP地址。

并将答案转换为全长IPv6等...:

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}\b" -- file

如果要保留/ nnn(如果存在):

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}(/[0-9]{1,3}){0,1}\b" -- file

还有IPv6的简化版本,其中包括“ ::”。

有关更多IPv6答案,您可以在这里查看:https : //stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses


fgrep是该变量的旧名称grep,忽略了模式匹配。我建议您改用grep(或什至egrep),尤其是当您显然想要模式匹配时。
roaima

2

如果您的文件名为,例如,ips您可以编写somethinng,例如:

while read -r ip
    do
        if [[ $ip == "$1" ]]; then
            shift
            printf '%s\n' 'action to take if match found'
        else
            printf '%s\n' 'action to take if match not found'
        fi
    done < ips

然后,您可以按照脚本传递参数

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132

1

SmartOS(Solaris的一个变体)中进行了测试,希望可以在其他* nix环境中工作:

egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])'

例:

$ cat >file.txt
IP1: 192.168.1.1
IP2: 261.480.201.311
IP3: 1012.680.921.3411

$ egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt
IP1: 192.168.1.1

这种模式只匹配有效的IPv4,即,x.x.x.x其中x从0到255不等。如果您只需要提取匹配的IP,请-o在上述命令中添加一个选项。您可以将此命令嵌入bash脚本中,也可以嵌入其他shell脚本中。而且,如果egrep失败,try grep -E ...

在(bash)shell脚本中使用它:

ip=$(egrep -o '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt) echo $ip


这很适合在CentOS 6的系统,用grep 2.6.3
大卫·拉米雷斯

0

如果文件中有IP列表(每行一个),则grep已经具有方便的-f选项:

$ man fgrep | grep file= -A1
       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.  (-f is specified by POSIX.)

这可能会导致一些误报,这是由于字符串(可选)后跟另一个数字以使其成为不同的IP。您可以做很多事情,具体取决于您的情况,您可能会决定是否会担心。


0

我认为我对其他帖子的回答更适合这里。多亏了这篇文章以及其他类似的文章,我才想到了这一点,即寻找正确的IP格式,然后删除所有包含256或更高版本的行。用无效的IP替换IP,以查看无输出:

echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]'

第一个grep可能是在此帖子中找到的,它会检查X-XXX格式的0-999之间的任何数字

第二个grep删除编号为256-999的行,因此仅保留有效格式的IP,因此我认为

但是...正如G-Man所指出的那样,我错误地认为IP将位于自己的线路上。不过,最经常的是,在IP的任何一侧都会有一个空间或另一个分隔符来寻找。找到IP后,可用sed或其他方法删除空格/分隔符。我还在第一个grep中添加了-o:

echo ' 1234.5.5.4321 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

echo ' 234.5.5.432 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
echo ' 234.5.5.100 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

第一个和第二个不输出,而第三个和第二个不输出。


假设我有500个地址,范围从10.0.0.1到10.0.1.244。grep由于“ 500”,您的第二个将淘汰该行。(该问题从未说过文件中的IP地址(如果有的话)将单独位于一行上。)另一方面,它将接受1234.1.1.1和1.1.1.1234。但是除此之外,还不错。
G-Man说'Reinstate Monica''Apr

-1

将该输出重定向到一些 outputFile

grep用模式简单地

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>

4
请注意,.是一个正则表达式运算符和需要转义为它被视为字面上
斯特凡Chazelas

1
这些不是模式,而是文字。由于OP指定“任何IP”,所以这不是一个有用的答案。
马克·哈德森

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.