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

Yok*_*kai 4 administration sed tr

我制作了一个在服务器上运行的 Bash 工具。此工具将在特定时间范围内(即从早上 5 点到下午 3 点 30 分)阻止某些 IP 地址。

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

ping google.com -c 1 -s 16
Run Code Online (Sandbox Code Playgroud)

输出将是:

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
Run Code Online (Sandbox Code Playgroud)

我缩小这个输出的命令是:

ping google.com -c 1 -s 16 | grep -o '([^ ]*' | tr -d '(44):\n'
Run Code Online (Sandbox Code Playgroud)

这给了我一个输出:

173.19.66.113173.19.66.113ubuntu@yokai
Run Code Online (Sandbox Code Playgroud)

如您所见,存在相同 IP 地址的重复项。如何使用 sed 删除重复项,以便我可以将单个 IP 地址存储到变量中并将脚本作为 cronjob 运行,或者我是否使用 tr 处于更好的轨道?

(编辑)

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

(更新)由于有些人将此问题标记为与其他一些与此无关的废话问题的重复,因此我将足够清楚地说明有英语理解问题的迟钝者可以理解:

如何解析IP地址“ONLY”ping OUTPUT当使用ping一个域名。

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

(最新更新)自从问这个问题以来,我学习了正确的 POSIX 正则表达式来做我需要的事情,我需要明确表示我最初是在询问正则表达式,sed它会从 ping 输出打印 IP 的单个实例. 从那以后,我改进了我的方法,并没有使用这里的任何答案,但我感谢每个人在这里提供帮助的尝试。我现在正在使用我创建的计时器脚本来在某些时间配置 iptables 以阻止某些域名解析。再次感谢所有试图提供帮助的人。

hee*_*ayl 15

ping 用于根据 ICMP 响应检查主机是启动还是关闭,它永远不是仅解析 IP 地址的正确工具,有专门的工具可以解决这个问题。

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

这是一个dig输出:

% 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
Run Code Online (Sandbox Code Playgroud)

附带说明一下,在 Linux 中,如果您想通过 NSSwitch(名称服务交换机)ie 进行查询/etc/nsswitch,请使用getent带有hosts(或ahosts)数据库的命令,例如:

getent hosts google.com
Run Code Online (Sandbox Code Playgroud)

在我的电脑中,我有:

hosts: files mdns4 dns
Run Code Online (Sandbox Code Playgroud)

in /etc/nsswitch.conf,因此getent hosts将按顺序查询并使用gethostbyaddr(3)gethostbyname(3)基于名称ahosts将使用getaddrinfo(3).

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


如果你坚持使用pingand sed,你可以这样做:

% ping -c1 google.com | sed -nE 's/^PING[^(]+\(([^)]+)\).*/\1/p'
123.108.243.56
Run Code Online (Sandbox Code Playgroud)

  • ping 和 grep... `ping ... | grep -oP 'PING.*?\(\K[^)]+'` (2认同)

cut*_*tjm 6

浏览谷歌我找到了另一个unix.SE 帖子的链接,提到了getent- 我什至不知道这个程序存在。

您可以使用getentlikedig将 IP 解析为主机名 - 我的系统getent默认已安装,但未安装dig. 如果您想要 ipv6 主机,请更改ahostsv4ahostsv6.

getent ahostsv4 google.com | awk '{print $1}' | head -1
Run Code Online (Sandbox Code Playgroud)

我添加了这个答案,因为我不擅长正则表达式 / sed 并且无法想出@heemayl 的答案。