2017-02-23 5 views
0

ログファイル内のタイムスタンプ付きの行を検索したい(すべての行にタイムスタンプがあるわけではありません)、タイムスタンプを見ることができるように、などのアクティブな一日数、grepが1つのファイルにマッチした行と別のファイルにマッチした文字列

201 3083560 2013-10-21T13:57:55.334+0200 time|bootup 
202 3083560 2013-10-21T13:57:55.334+0200 startup 
204 3083579 2013-10-21T13:57:55.353+0200 system|device 
205 3083579 2013-10-21T13:57:55.353+0200 system|manufacturer 
206 3083579 2013-10-21T13:57:55.353+0200 system|model 

私はコマンドを実行できます。

grep -P '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' usr.log > file1.txt 
grep -Po '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' usr.log > file2.txt 

そして、私の質問は、私はいくつかのパイプで必要なものを得るために、一度だけのgrepを実行できますか?パターンは同じにとどまるので、私は30kの個別のユーザーログファイルを持っているので、grepが一度私を保存できると思います。

*パターンの最後にタブを置いておくと便利です。最後の列に時間の値があるため、\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\nを除外する必要があります。

*私の環境はCentOS 7、grep(GNU)2.20です。

ありがとうございます!

私は、これは1 grepによって行うことができますが、他の1つはgrepの出力を送信する場合は、一度ファイルを読み取り、 grepの出力を再利用して逃げることができるとは思わない
+0

をあなたは '直接usr.log'に' grepの-oP'を使用することができ、それを2回実行する必要はありません。 – Inian

+0

正規表現 '\ d {4} - \ d {2} - \ d {2} T \ d {2}:\ d {2} \ d {2} \。\ d {3} [+ - ] \ d {2} \ d {2} \ d {2} \ d {2} \ d {2} \ d {2} [+ - ] \ d {4} \ n'がサンプル入力ファイルの行と一致しません – Inian

+0

ありがとう!私は余分なものを置くのを忘れました:パターンで。今私はそれを修正しました。しかし、どのように1回の実行でそれを行うことができますか?私はfile1.txtも保存したい。 – leoce

答えて

0

regex='\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' 
grep -P "$regex" usr.log | tee file1.txt | grep -Po "$regex" > file2.txt 

は、入力をファイルに保存し、stdoutにも出力するので、パイプの途中で出力を保存すると便利です。

あなたがawkを使用することができるなら、あなたはそれが3番目のフィールドであることを利用し、1回の実行でそれを行うことができますが:

awk '/[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}.[0-9]{4}\t/ \ 
    {print $3 > "file2.txt"; print}' usr.log > file1.txt 
0

あなたがperlであなたの正規表現を実行する場合は、標準出力との間に、あなたの出力を分割することができますそして、stderrだけマッチした文字列を印刷する$&変数を使用して:

perl -ne 'if(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}/){print; print STDERR "$&\n"}' usr.log > file1.txt 2> file2.txt 
関連する問題