如何在远程计算机上执行 grep 并打印出包含这些单词的行?

如何在远程计算机上执行 grep 并打印出包含这些单词的行?

我的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单词,则打印出该行,同时打印出包含单词的行animalattribute和词也类似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 的选项中。

相关内容