使用ssh的grep变量

四月

我想在包含单词wrod1word2的目录中搜索文件我想在本地目录中搜索时使用以下命令,它可以正常工作:

for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2
 $FILE && echo $FILE; done

由于在使用远程主机时无法使用变量,我该怎么办。我从其他线程(通过SSH进行远程循环)中发现,人们使用该命令连接服务器,然后将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
库萨兰达

由于默认外壳程序tcsh位于远程主机上,因此您可能需要显式启动sh外壳程序:

ssh username@servername sh -c 'for FILE in pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'

还要注意,您应该对$FILE变量扩展名加双引号,以应对其中包含外来字符的文件名。

另请注意,尽管您使用word1word2一起使用grep,但它们是正则表达式而不是单词要在文件中查找单词,请使用grep -wF "word"


似乎ssh总是将运行登录Shell来在远程主机上执行给定命令,如果确实如此tcsh,则很难在命令行脚本中获得正确的引用。

两种解决方案(我都不喜欢):

  1. 远程主机上的登录壳改变为sh像样壳bashkshzsh通过在主机上登录并运行来执行此操作chsh

  2. 把脚本中的脚本文件,并通过执行它ssh

    ssh username@servername sh ./script.sh
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章