ログファイルの一部を切り取るには?

ログファイルの一部を切り取るには?

8GBのログファイル(Railsプロダクションログ)があります。いくつかの日付(行)の間にカットする必要があります。これを行うにはどのコマンドを使用できますか?

答え1

それはまるで

sed '1,/last date prior to chunk/d;/first date after chunk/,$d' logfile | tee cut-log | less

tee cut-log画面にファイルの内容を表示できますcut-log

編集する:

fred.bearの厳しい基準を満たすために、ここにsedソリューションがあります(もちろん、awkソリューションはもっときれいですが)。

b=BB; e=EE ;echo -e "AA\nAA\nBB\nBB\nCC\nCC\nDD\nDD\nEE\nEE\nFF\nFF" | sed -n ":b;/$b/b p;n;b b;:p;p;n;/$e/b e;b p;:e;p;n;/$e/b e;q"

答え2

FOOとBAR(FOOとBARを含む)の間のすべての内容を印刷するには、以下を試してください。

$ sed -n '/FOO/,/BAR/p' file.txt

答え3

これにより、目的のタスクが実行されます。
包含および除外パラメータの日付を表示します。

# set Test args
set  2011-02-24  2011-02-26  "junk"

from="$1"
till="$2"
file="$3"

# EITHER ====                              +++++++++  
# Ouptut lines between two parameter dates INCLUDING the parameter dates
  awk -v from=$from -v till=$till '
    ($2 >= from) && ($2 <= till) { print $0 ; next }
    ($2 > till) { exit }' "$file"

# OR ========                              ---------
# Ouptut lines between two parameter dates EXCLUDING the parameter dates
  awk -v from=$from -v till=$till '
    ($2 > from) && ($2 < till) { print $0 ; next }
    ($2 >= till) { exit }' "$file"

フィールド2の(ソートされた)日付をテストします。以下はテストデータの例です。

    98  2011-02-05 xxxx
    99  2011-02-05 xxxx
   100  2011-02-06 xxxx
   101  2011-02-06 xxxx

これはテストデータジェネレータ

答え4

このように大きなファイルを扱うことは常に困難です。

1つの方法は、このファイルを複数の小さなファイルに分割することです。これには分割コマンドを使用できます。

split -d -l 50000 ToBigFile.data file_

分割されていても、bash forループと同様にファイルを引き続き使用できます。

for f in `ls file_*`; do cat $f; done;

ただし、catの代わりにreverse grepを使用して不要なデータを削除できますが、これには関係ありません。 (または必要な改善の種類)。

この時点では、多くの小さなファイルのみが処理され、上記のその他のコマンドは多くの小さなファイルで機能します。

完了したら、2番目のforループを使用して小さなファイルを再構築できます。

for f in `ls file_*`; do cat $f >> NewFile.data ; done;

修正する データを複数のファイルに分割し始めると、ハードドライブは多くの作業を実行するため、時間がかかります。 (この問題については5分ほどかかったようです)。

一方、次のステップはより速いかもしれません。

したがって、このアプローチは単純なgrep、awk、sed操作には意味がないかもしれませんが、検索パターンがより複雑になると速度が速くなる可能性があります。

関連情報