リモートシステムで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の固定文字列機能を使用できます。これにより正規表現処理がオフになり、プロセスが高速化されます。

おすすめ記事