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'
-F
grep のオプションに追加します。