首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed从ping命令中提取IP地址?

问使用sed从ping命令中提取IP地址?
EN

Unix & Linux用户
提问于 2016-09-05 02:44:34
回答 3查看 18.2K关注 0票数 4

我已经构建了一个运行在服务器上的Bash工具。这个工具会在一定的时间范围内阻止某些IP地址(即从上午5点到下午3点30分)。

目前,该工具工作良好,但我必须手动将IP地址输入到某个网站的文本文件中,并让工具使用"head“和"tail”命令根据第n行提取IP地址。我不想这样做,因为我相信一个ping将更加轻量级和便携。因此,如果我为Google做一个ping操作:

代码语言:javascript
复制
ping google.com -c 1 -s 16

产出如下:

代码语言:javascript
复制
Ubuntu@yokai:~# ping google.com -c 1 -s 16
PING google.com (173.194.66.138) 16(44) bytes of data.
24 bytes from qo-in-f138.1e100.net (173.194.66.138): icmp_seq=1 ttl=37 time=46.7 ms

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 46.748/46.748/46.748/0.000 ms

我缩小了输出范围的命令是:

代码语言:javascript
复制
ping google.com -c 1 -s 16 | grep -o '([^ ]*' | tr -d '(44):\n'

这给了我一个输出:

代码语言:javascript
复制
173.19.66.113173.19.66.113ubuntu@yokai

如您所见,有一个相同IP地址的副本。如何使用sed删除副本,以便将单个IP地址存储到变量中,并以cron作业的形式运行脚本,或者使用tr进行更好的跟踪?

(编辑)

我已经知道/知道如何从主机名或域解析IP地址。这不是我在这里要求的。这个问题特别是关于使用sed管理ping输出,以便使我创建的工具更易于移植,因为ping与几乎所有linux发行版都是默认的。

(更新)由于有些人把这个问题标记为与这个问题无关的其他胡说八道的问题的副本,我会明确地说明,有英语理解障碍的人可以理解:

当在域名上使用ping时,如何解析来自ping输出的IP地址“只”。

这不是要求解析一个域名,因此不是一个重复!

(最新更新)自从问这个问题以来,我已经学会了正确的POSIX正则表达式来做我需要做的事情,我需要明确的是,我最初询问的是sed的正则表达式,它将从ping输出中输出一个IP实例。自那以后,我改进了我的方法,没有在这里使用任何答案,但我感谢每个人在这里提供帮助的努力。现在,我正在使用我创建的计时器脚本来在特定时间配置iptable来阻止特定的域名解析。再次感谢所有想帮忙的人。

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2016-09-05 03:09:35

ping用于根据ICMP响应检查主机是否处于上或下,它永远不是只解析IP地址的正确工具,有专门的工具。

你应该看看dig,host,nslookup --任何最适合你的。

下面是一个dig输出:

代码语言:javascript
复制
% dig +short google.com
123.108.243.57
123.108.243.51
123.108.243.54
123.108.243.48
123.108.243.60
123.108.243.52
123.108.243.56
123.108.243.55
123.108.243.61
123.108.243.58
123.108.243.49
123.108.243.50
123.108.243.59
123.108.243.47
123.108.243.53

另外,在Linux中,如果您想通过NSSwitch (名称服务开关)(即/etc/nsswitch )进行查询,那么可以在hosts (或ahosts)数据库中使用getent命令,例如:

代码语言:javascript
复制
getent hosts google.com

在我的电脑里,我有:

代码语言:javascript
复制
hosts: files mdns4 dns

在/etc/nsswitch.conf中,getent hosts将按顺序查询,并根据名称使用gethostbyaddr(3)或gethostbyname(3),ahosts将使用getaddrinfo(3)。

本质上,使用我的配置,这将首先检查/etc/hosts,然后检查mDNS,最后检查DNS。

如果您坚持使用ping和sed,您可以:

代码语言:javascript
复制
% ping -c1 google.com | sed -nE 's/^PING[^(]+\(([^)]+)\).*/\1/p'
123.108.243.56
票数 17
EN

Unix & Linux用户

发布于 2016-09-05 05:38:10

浏览谷歌,我找到了另一个unix.SE邮政的链接,其中提到了getent --我甚至不知道这个程序的存在。

您可以使用getent (如dig )将IP解析为主机名--我的系统默认安装了getent,但没有安装dig。如果需要ipv6主机,请将ahostsv4更改为ahostsv6。

代码语言:javascript
复制
getent ahostsv4 google.com | awk '{print $1}' | head -1

我添加了这个答案,是因为我不擅长regexes / sed,因此无法给出@heemayl的答案。

票数 6
EN

Unix & Linux用户

发布于 2016-09-05 07:41:48

需要注意的一点是,正如您在@heemayl的dig输出中看到的那样,有些站点可能有多个IP地址。您可能需要一个DNS查找来获取它们,因为ping只使用它获得的第一个地址。其他主要想要连接的东西也是一样,而不是特别列出地址。

(此外,在google这样的情况下,您将得到不同的IP地址,这取决于您所处的位置。这里可能不是问题,但值得注意。)

另一件事,关于你使用的命令。这:tr -d '(44):\n'从输入中删除字符(、4、)、:和\n的所有副本。tr总是只查看单个字符,而不是字符串。查看您获得的输出,您将看到IP地址中间丢失了一个4。使用像sed这样的其他工具来处理字符串。

为了显示自行车棚的不同颜色,这里有另一个简单的grep:

代码语言:javascript
复制
$ ping google.com -c1 | head -1 | grep -Eo '[0-9.]{4,}'
172.217.22.174
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/307895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档