リモートシステムで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特定のパターンに対してすべてのログファイルを解析し、そのパターンを含む行を印刷する必要がある汎用シェルスクリプトを作成しようとしています。すべてのSSHキーが設定された状態で、以下のシェルスクリプトを実行しますmachineA。つまり、マシンAからマシン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これらの変数に単語を保存します。

私は小さな変数のセットを把握する方法を知っています。 machineBのコマンドラインからgrepを直接実行する必要がある場合は、次のようにします。

grep -E 'hello|animal|atttribute|metadata' ptd.log | grep -v 'timeout'

しかし、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'"

-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.次のように各単語を1行に入力します。

wordsToInclude='hello
animal
atttribute
metadata'

wordsToExclude='timeout
runner'

-Fgrepのオプションに追加されました。

関連情報