ログを読むときに単語を除外するために別のファイルを読み取る賢明な方法

ログを読むときに単語を除外するために別のファイルを読み取る賢明な方法

ログファイルを検索するときに除外したい単語を除外するためにいつでも変更できる別のテキストファイルが必要です。これまで私は私の目的に合わせて以下の基本スクリプトを書いています。 Sunオペレーティングシステムで。助けてください。

find /export/home/testing/ -type f -name "apache_logs.txt" |while read file
  do  
    result=$(tail -50 $file |grep -v 'HTTP/1.1" 200'  $file)
    echo "$result" > result1.txt
    grep -v 'akamai/sureroute' | grep -v '/wp7/wp-login.php' | grep -v  'HTTP/1.0" 200' result1.txt  > result.txt; 
  done

ベストアンサー1

Solarisでは、/usr/xpg4/bin/grepファイルからパターンを読み取り、thenを-f使用して文字列比較を実行するために使用できます-F

find /export/home/testing -type f -name apache_logs.txt -exec tail -n 50 {} \; |
/usr/xpg4/bin/grep -vF -f avoid.txt >result.txt

... avoid.txt1行に1つの文字列を含むテキストファイル:

akamai/sureroute
/wp7/wp-login.php
HTTP/1.0" 200
HTTP/1.1" 200

apache_logs.txtこれは、ディレクトリ内または下で呼び出される一般的なファイルを探します/export/home/testing。これらのファイルごとにtail -n 50呼び出して最後の50行を取得します(コードに応じて、各ファイルの内容全体をインポートするためにcat代わりに使用してください)。tail -n 50

結果のテキスト行はパイプで連結され、ファイルにリストされている部分文字列を含む各行は/usr/xpg4/bin/grepフィルタリング(削除)されます。avoid.txt

使用されたオプションgrep

  • -v一致の意味を反転します(行を返すいいえ一致するパターン)。
  • -F各パターンを次のように処理します。ひも正規表現一致ではなく文字列比較を実行します。これにより、ファイルのパターンに特殊文字をエスケープせずに正規表現に含めることができます。
  • -f avoid.txtファイルからパターンを読みますavoid.txt

テキストの残りの行が記録されますresult.txt

この-Fオプションがない場合は、パターンに注意してavoid.txt正しい正規表現にする必要があります。たぶん良い

akamai/sureroute
/wp7/wp-login\.php
HTTP/1\.[01]" 200

findただ一つだけ探したいなら単一ファイル、コードは次のように単純化できます。

tail -n 50 /path/to/apache_logs.txt |
/usr/xpg4/bin/grep -vF -f avoid.txt >result.txt

コードにはいくつかの問題があります。

  • 変数拡張を引用しません。バラよりいつ二重引用符が必要ですか?
  • 不必要にパイプ結果を変数に保存し、それを使用してecho結果をファイルに出力します。
  • 最初のtail+パイプはパイプの両側に使用されますgrep。これは入力を無視します$filegreptail
  • 2番目の(より長い)パイプはresult1.txt最後のパイプでのみ使用され、前のgrepコマンドgrepはstdinからデータを読み取るのを待ち(存在しません)、最後のコマンドが完了したgrep後に終了します。

    このタイプのパイプは通常次のとおりです。

    command inputfile | command | command | command
    

    つまり、一部の入力ファイルからデータを読み取り、それを標準出力に書き込むコマンドで始まります。出力は次のコマンドで読み取られ、それ出力は次の出力から読み取られます。

  • 出力ファイルresult.txt修正apache_logs.txt見つかった各ファイルの書き込みにループで使用したのと同じように、最初から始めます。単一のファイル>だけを探している場合は問題ありませんfind(この場合、findファイルがファイルシステムから移動しない可能性があるため、使用しないことをお勧めします)。

  • find解析の出力(検出されたファイルのパス名)を使用しますread。一般に、Unixのパス名には、\0Cプログラミング言語の文字列終端であるNULL文字()を除いて、改行やバックスラッシュを含むすべての文字を含めることができるため、これは一般的に悪い考えです。バラより検索結果を繰り返すのはなぜ悪い習慣ですか?

また関連:

おすすめ記事