我的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 的選項中。