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操作には意味がないかもしれませんが、検索パターンがより複雑になると速度が速くなる可能性があります。