8 Gbのログファイル(Railsのプロダクションログ)があります。いくつかの日付(行)の間でカットする必要があります。これを行うにはどのコマンドを使用できますか?
何かのようなもの
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"
FOOとBARの間のすべてを印刷するには、次のことを試してください。
$ sed -n '/FOO/,/BAR/p' file.txt
これはあなたが望むことをします...
パラメーターの日付を含むものと含まないものの両方が表示されます。
# 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
そして、これが test-data generator です。
ログファイルにこの形式の日付がある場合YYYY-MM-DD
次に、たとえば2011-02-10のすべてのエントリを検索するには、次のようにします。
grep 2011-02-10 log_file
ここで、2011-02-10と2011-02-11のエントリを検索する場合は、もう一度grep
を使用しますが、複数のパターンを使用します。
grep -E '2011-02-10|2011-02-11' log_file
このサイズのファイルでの作業は常に困難です。
今後の方法は、このファイルをいくつかの小さなファイルに分割することです。これを行うには、splitコマンドを使用できます。
split -d -l 50000 ToBigFile.data file_
分割されていても、bash forループを使用する場合と同じようにファイルを操作できます
for f in `ls file_*`; do cat $f; done;
しかし、猫の代わりに、反転されたgrepを使用して不要なデータを取り除くことができます。これは関係ありません。 (または必要な改良の種類)。
この時点では、たくさんの小さいファイルを操作するだけで、上記の他のコマンドはたくさんの小さいファイルでスムーズに動作します。
そして、完了したら、2番目のforループを使用して、新しい小さなファイルを再度作成できます。
for f in `ls file_*`; do cat $f >> NewFile.data ; done;
pdateデータを複数のファイルに分割し始めるので、ハードドライブで多くの作業が行われ、時間がかかります。 (この質問では明らかに5分です)。
一方、次のステップはおそらくより速くなります。
したがって、この方法は、単純なgrep、awk、sed操作にはおそらく無意味ですが、検索パターンがより複雑になると、より速くなる可能性があります。
Perl -wlne '/^2011-02-24/ .. /^2011-02-25/ and print' log_file