如何使用 grep 的输出进行 ping

如何使用 grep 的输出进行 ping

我拼命尝试将 grep 的输出用于脚本:

ping dc"$(grep -o .""\[12].domain.local"" /etc/squid3/squid.conf)"

ping "$(grep -o ""dc0\[12].domain.local"" /etc/squid3/squid.conf)"

两者都返回:

ping: unknown host dc02.domain.local

如果我输入ping dc02.domain.local,它就可以工作!我看不出来,我做错了什么?

/etc/squid3/squid.conf 的相关行是:

external_acl_type memberof %LOGIN /usr/lib/squid3/squid_ldap_group -R -K -b "dc=domain,dc=local" -D [email protected] -W /aaa/bbb/ccc.txt -f "(&(objectclass=person)(sAMAccountName=%v)(memberof=cn=%g,ou=aaa,ou=bbb,ou=ccc,ou=ddd,ou=eee,dc=domain,dc=local))" -h dc02.domain.local

答案1

失败的原因是文件/etc/squid3/squid.conf包含多行与模式匹配的行。因此,当你这样做时

ping "$(grep ....)"

所有换行符分隔的匹配项都作为单个参数传递,该ping参数每次只接受一个地址作为参数,因此失败。

请注意,您可以使用以下命令简化最后一个单词的匹配,而不是使用已经使用的正则表达式模式:

grep -o 'dc[^ ]\+$' /etc/squid3/squid.conf

假设该单词以 开头dc

最后,由于您要运行多个地址ping,因此您应该使用循环:

for i in $(grep -o 'dc[^ ]\+$' /etc/squid3/squid.conf); do ping -c 4 "$i"; done

ping -c 4将向每个目的地发送 4 个 ICMP Echo_Request 数据包。

答案2

您还可以使用awk

awk -F'-h ' '/-h +dc0[12]/ {system("ping -c 3 "$2)}'
  • -F'-h '

    我们只对背后的事情感兴趣-h

  • /-h +dc0[12]\.domain\.local/

    我们只对字符串dc01.domain.local感兴趣dc02.domain.local

相关内容