web-dev-qa-db-ja.com

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

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

18
user5113

何かのようなもの

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"
12
asoundmove

FOOとBARの間のすべてを印刷するには、次のことを試してください。

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

これはあなたが望むことをします...
パラメーターの日付を含むものと含まないものの両方が表示されます。

# 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 です。

5
Peter.O

ログファイルにこの形式の日付がある場合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
4
Barun

このサイズのファイルでの作業は常に困難です。

今後の方法は、このファイルをいくつかの小さなファイルに分割することです。これを行うには、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操作にはおそらく無意味ですが、検索パターンがより複雑になると、より速くなる可能性があります。

1
Johan
Perl -wlne '/^2011-02-24/ .. /^2011-02-25/ and print' log_file
0
charlesbridge