如何在遠端電腦上執行 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 的選項中。

相關內容