我有很多服务器,如 sdeuu1、sdeuu2、sdeuu3 等。
我想对它们每一个运行一个查询,查询是:
grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* |
grep -ic 'nextag.co.uk'
当在单独的服务器上运行时,此查询返回完美的结果。
现在我有一台名为 sdalp1 的服务器,我可以通过它 ssh 到 sdeuu1、2、3 等,然后转到该服务器运行查询。现在我不想这样做,而是想从 sdalp1 一次性为所有 sdeuu 服务器运行查询,我尝试了以下命令及其几个其他版本:
for i in sdeuu1 sdeuu2 sdeuu3 sdeuu4 sdeuu5 \
sdeuu6 sdeuu7 sdeuu8 sdeuu9 sdeuu10 \
sdeuu11 sdeuu12 sdeuu13 sdeuu14 sdeuu15 \
sdeuu16 sdeuu17 sdeuu18; do
grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* |
grep -ic 'nextag.co.uk'"
echo $i
done
但是此命令对所有服务器返回错误,如下所示:
-bash: grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* | grep -ic 'nextag.co.uk': No such file or directory
这里的问题是什么?我不明白这是否是权限问题?
答案1
for i in sdeuu1 sdeuu2 sdeuu3 sdeuu4 sdeuu5 \
sdeuu6 sdeuu7 sdeuu8 sdeuu9 sdeuu10 \
sdeuu11 sdeuu12 sdeuu13 sdeuu14 sdeuu15 \
sdeuu16 sdeuu17 sdeuu18; do
ssh $i grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* \| \
grep -ic 'nextag.co.uk'
echo $i
done
请注意,我ssh $i
在循环内添加了命令的开头。
\
我还在管道符号 ( ) 后面添加了一个反斜杠 ( ) |
,这样第二次 grep 就会在每个单独的服务器上进行,以提高效率。然后,我还需要在该行末尾添加一个反斜杠来表示续行,因为转义的管道符号不再起到这个作用。输入此命令时,请确保在最后一个反斜杠后不要添加任何空格。
如果这令人困惑,您也可以将所有内容放在一行中完成:
for i in sdeuu1 sdeuu2 sdeuu3 sdeuu4 sdeuu5 \
sdeuu6 sdeuu7 sdeuu8 sdeuu9 sdeuu10 \
sdeuu11 sdeuu12 sdeuu13 sdeuu14 sdeuu15 \
sdeuu16 sdeuu17 sdeuu18; do
ssh $i grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* \| grep -ic 'nextag.co.uk'
echo $i
done
如果你还没有设置,你可以设置无密码 ssh 登录这样您就不必为每个服务器输入密码。