我想搜索目录中包含这两个单词的文件字1和字2。当我想在本地目录中搜索时,我使用以下命令并且工作正常:
for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2
$FILE && echo $FILE; done
由于在使用远程主机时无法使用变量,我应该做什么。我从其他线程中发现(通过 SSH 进行远程 for 循环)人们使用该命令连接到服务器,然后将 find 命令放在后面的引号中。与此类似:
ssh -l username servername 'for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2 $FILE && echo $FILE; done'
但这对我来说仍然不起作用。
我现在运行的命令(仍然给我错误):
ssh username@servername sh -c 'for FILE in /pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'
错误
FILE: -c: line 0: syntax error near unexpected token `newline'
FILE: -c: line 0: `for'
FILE: Undefined variable
答案1
由于默认 shell 位于tcsh
远程主机上,因此您可能需要显式启动sh
shell:
ssh username@servername sh -c 'for FILE in pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'
另请注意,您应该双引号$FILE
变量扩展来处理包含外来字符的文件名。
另请注意,虽然您使用word1
和word2
with grep
,但这些是常用表达并不是字。要在文件中查找单词,请使用grep -wF "word"
.
似乎总是ssh
会运行登录 shell 在远程主机上执行给定的命令,如果是这样的tcsh
话真的很难在命令行脚本中获得正确的引用。
两种解决方案(我都不喜欢):
将远程主机上的登录 shell 更改为
sh
类似 shell,如bash
、ksh
或zsh
。通过登录主机并运行来执行此操作chsh
。将脚本放入脚本文件中并通过
ssh
以下命令执行ssh username@servername sh ./script.sh