![如何在远程计算机上执行 grep 并打印出包含这些单词的行?](https://linux22.com/image/57446/%E5%A6%82%E4%BD%95%E5%9C%A8%E8%BF%9C%E7%A8%8B%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%E6%89%A7%E8%A1%8C%20grep%20%E5%B9%B6%E6%89%93%E5%8D%B0%E5%87%BA%E5%8C%85%E5%90%AB%E8%BF%99%E4%BA%9B%E5%8D%95%E8%AF%8D%E7%9A%84%E8%A1%8C%EF%BC%9F.png)
我的machineB
这个目录下有几个日志文件/opt/ptd/Logs/
,如下所示 - 我的日志文件非常大。
david@machineB:/opt/ptd/Logs$ ls -lt
-rw-r--r-- 1 david david 49651720 Oct 11 16:23 ptd.log
-rw-r--r-- 1 david david 104857728 Oct 10 07:55 ptd.log.1
-rw-r--r-- 1 david david 104857726 Oct 10 07:50 ptd.log.2
我正在尝试编写一个通用的 shell 脚本,该脚本应该尝试解析我的所有日志文件machineB
以获取特定模式并打印具有这些模式的行。我将运行下面的 shell 脚本,machineA
其中所有 ssh 密钥都设置了所有内容,这意味着我需要从机器 A 远程 grep 机器 B 上的日志文件。
#!/bin/bash
wordsToInclude="hello,animal,atttribute,metadata"
wordsToExclude="timeout,runner"
# now grep on the various log file for above words and print out the lines accordingly
意思是,我将在变量中用逗号分隔单词wordsToInclude
- 如果我的日志包含hello
单词,则打印出该行,同时打印出包含单词的行animal
。attribute
和词也类似metadata
。
而且我还会在wordsToExclude
变量中使用逗号分隔单词 - 如果任何行包含这些单词,则不要打印出这些行。
我现在使用上述格式来存储单词,但任何更好的格式对我来说都可以。我可以在wordsToInclude
变量中包含很长的单词列表wordsToExclude
,这就是为什么我将它们存储在这些变量中。
我知道如何对一小组变量执行 grep 操作。如果我需要直接在 machineB 上从命令行执行 grep,那么我会这样做 -
grep -E 'hello|animal|atttribute|metadata' ptd.log | grep -v 'timeout'
但我不确定如何将其组合到我的 shell 脚本中,以便我可以从 machineA 在 machineB 上执行远程 ssh grep 。
答案1
如果您愿意接受其他格式,请考虑:
inc="hello|animal|atttribute|metadata"
exc="timeout|runner"
ssh machineB "grep -E '$inc' path/ptd.log | grep -vE '$exc'"
更快的替代方案
如果您的日志文件很大并且您正在查找固定单词,而不是花哨的正则表达式,您可能需要考虑这种方法:
inc='hello
animal
atttribute
metadata'
exc='timeout
runner'
ssh office "grep -F '$inc' ptd.log | grep -vF '$exc'"
通过将每个单词放在单独的行上,我们可以使用 grep 的-F
固定字符串功能。这会关闭正则表达式处理,从而使该过程更快。
答案2
这似乎不可能,但您可以使用 的grep
选项-f
来使用该单词列表,即使它们位于环境变量中而不是正确的文件中。诀窍在于欺骗性地grep
认为它们来自这样的文件:
$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") file1 file2 file3'
这将通过machineBgrep ...
远程运行命令。ssh
它将获取您的变量,$wordsToInclude
并将逗号切换为行尾字符 ( ,
-> \n
)。然后grep
通过其开关输入该单词列表-f
。
要通过排除列表运行此命令,只需通过管道将其添加为第一个 grep 之后的第二个 grep 即可。
$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") \
file1 file2 file3 | grep -vf <(echo $wordsToExclude)'
答案3
SSH 使用如下命令运行:
ssh host command
或者在你的情况下:
ssh -t machineB "grep -E \"$wordsToInclude\" ptd.log | grep -v \"$wordsToExclude\""
这-t
可以防止“ioctl 错误”。我还建议使用 grep 的固定字来提高速度,如指定的这个答案作者:@John1024。只需将每个单词放在自己的行上,例如:
wordsToInclude='hello
animal
atttribute
metadata'
wordsToExclude='timeout
runner'
并添加-F
到 grep 的选项中。