我拼命尝试将 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