リモート マシンで 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

私は、すべてのログ ファイルを特定のパターンで解析しmachineB、そのパターンを含む行を出力する汎用シェル スクリプトを作成しようとしています。machineAすべての SSH キーが設定されている以下のシェル スクリプトを実行するため、machineA から machineB のログ ファイルをリモートで grep する必要があります。

#!/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'

しかし、マシンA からマシンB でリモート ssh grep を実行できるように、これをシェル スクリプトでどのように組み合わせればよいかわかりません。

答え1

他の形式を検討している場合は、以下を検討してください。

inc="hello|animal|atttribute|metadata"
exc="timeout|runner" 
ssh machineB "grep -E '$inc' path/ptd.log | grep -vE '$exc'"

より速い代替手段

ログ ファイルが大きく、複雑な正規表現ではなく固定の単語を grep で検索する場合は、次の方法を検討してください。

inc='hello
animal
atttribute
metadata'

exc='timeout
runner'

ssh office "grep -F '$inc' ptd.log | grep -vF '$exc'"

各単語を別々の行に配置することで、-F固定文字列に grep の機能を使用できます。これにより、正規表現の処理がオフになり、プロセスが高速化されます。

答え2

grep不可能に思えるかもしれませんが、の-fオプションを使用すると、単語リストが適切なファイルではなく環境変数にある場合でも、その単語リストを利用できます。トリックはgrep、次のように、単語がファイルからのものであると思わせることです。

$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") file1 file2 file3'

grep ...これにより、machineB経由でリモートでコマンドが実行されますssh。変数が取得され、$wordsToIncludeカンマが行末文字 ( ,-> ) に切り替わります。この単語のリストは、スイッチ経由で に\n入力されます。grep-f

これを除外リストで実行するには、パイプを介して最初の grep の後に 2 番目の 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'

-Fgrep のオプションに追加します。

関連情報