2012-01-20 7 views
4

grepを使用していくつかのログを調べ、最新の項目だけを選択しようとしています。それは最初に一致しない行の後でgrepを停止する

tac error.log | grep 2012 
    tac error.log | grep "Jan.2012" 

など

を行うと、それは私がすでに一致するつもりはありません知っている数百万行を通過しながら、10分間待機するように愚かですので、ログは、それらの上に大量のトラフィックの年を持っています。私は-m最初の試合で停止するオプションがあることを知っていますが、最初に不一致で停止する方法はわかりません。私はgrep -B MAX_INT -m 1 2011のようなことをすることができましたが、それはほとんど最適な解決策ではありません。

これをgrepで処理できますか、awkが意味をなさないでしょうか?このようawkを使用することについてどのように

+0

あなたはあることが喜んでいる場合それはあまりアドホックなことではありません。あなたは 'tail -n N 'を使って最新のN個の行を抽出してから、今年から何も削除しないでgrepにパイプすることができます。 –

+1

私はawkまたは(実際には)perlを使用したいのですが、それはなぜですか? – reinierpost

+3

なぜあなたのログファイルが非常に大きくなるのを許可していますか?あなたがログのローテーションについて知る必要があるように思えます。 – tripleee

答えて

3

tac error.log | awk '{if(/2012/)print;else exit}' 

これは2012年と一致しない行とすぐに終了しなければなりませんが発見されました。

+1

質問は:それは 'grep'でできますか? – reinierpost

1

grepはこれをサポートしていません。これはあなたのログが書き込まれている場合、正確なことを行っていないことを

tail -n `tac biglogfile | grep -vnm1 2012 | sed 's/:.*//' | xargs expr -1 +` biglogfile 

注:

しかし、ここでは、私の「私たちは再びawkを持っていなかった理由」の答えです。ここで

+0

sedとxargsの部分について説明できますか?私はそれの残りの部分を理解しています。また、私は質問の言葉は、どんな解決策にもgrepを含める必要があるとは思わない、ちょうどそれが私が始まったところだ。 – mmdanziger

+0

部品が何であるかを見るためにピース単位で試してみてください...'grep -n'は行番号を一致する行で表示し、' sed'は行番号だけを残し、 'xargs expr'は1だけ減らします。 – reinierpost

2

は、Pythonでのソリューションです:

# foo.py 
import sys, re 
for line in sys.stdin: 
    if re.match(r'2012', line): 
     print line, 
     continue 
    break 

あなたがホスト> TACのfoo.txtの@ |救助へ

+1

Catの無駄な使用。単に 'python foo.py foo.txt'を使用してください。 – tripleee

+2

彼は 'tac foo.txt | python foo.py' – mmdanziger

+0

スニペットを更新しました。はい、私は "タック"を意味しました。 – guettli

1

優れたone-line scripts for sedページfoo.pyのpython:つまり

# print section of file between two regular expressions (inclusive) 
sed -n '/Iowa/,/Montana/p'    # case sensitive 

、あなたが次のことを行うことができるはず:

sed -n '/Jan 01 2012/,/Feb 01 2012/p' error.log | grep whatevs 
+0

偉大なリンクですが、それはまだ全体のファイルを通過しませんか? – mmdanziger

+0

はい、正規表現を作成するにはどのくらいの時間と正確さに依存しますが、非常に高速です。 – l0b0

+0

'grep'を使った同じ検索よりも速くなることはほとんどありません。 – tripleee

関連する問題