ログファイルを検索するときに除外したい単語を除外するためにいつでも変更できる別のテキストファイルが必要です。これまで私は私の目的に合わせて以下の基本スクリプトを書いています。 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.txt
1行に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
。これは入力を無視します$file
。grep
tail
2番目の(より長い)パイプは
result1.txt
最後のパイプでのみ使用され、前のgrep
コマンドgrep
はstdinからデータを読み取るのを待ち(存在しません)、最後のコマンドが完了したgrep
後に終了します。このタイプのパイプは通常次のとおりです。
command inputfile | command | command | command
つまり、一部の入力ファイルからデータを読み取り、それを標準出力に書き込むコマンドで始まります。出力は次のコマンドで読み取られ、それ出力は次の出力から読み取られます。
出力ファイル
result.txt
は修正apache_logs.txt
見つかった各ファイルの書き込みにループで使用したのと同じように、最初から始めます。単一のファイル>
だけを探している場合は問題ありませんfind
(この場合、find
ファイルがファイルシステムから移動しない可能性があるため、使用しないことをお勧めします)。find
解析の出力(検出されたファイルのパス名)を使用しますread
。一般に、Unixのパス名には、\0
Cプログラミング言語の文字列終端であるNULL文字()を除いて、改行やバックスラッシュを含むすべての文字を含めることができるため、これは一般的に悪い考えです。バラより検索結果を繰り返すのはなぜ悪い習慣ですか?
また関連: