3

私はircログ(irssiによって作成された)から日付を解析するための次の簡単なスクリプトを持っています

#!/bin/bash                                                                                  
query=$1

grep -n $query logfile > matches.log 
grep -n "Day changed" logfile >> matches.log

cat matches.log | sort -n

次のような出力を生成します。

--- Day changed Tue Jul 03 2012
--- Day changed Wed Jul 04 2012
--- Day changed Thu Jul 05 2012
16:54 <@Hamatti> who let the dogs out
--- Day changed Fri Jul 06 2012
--- Day changed Sat Jul 07 2012
--- Day changed Sun Jul 08 2012
12:11 <@Hamatti> dogs are fun

しかし、私は実際の試合の日付を見つけることだけに興味があるので、それらすべてを除外したいと思います

--- Day changed XXX XXX dd dddd

次の行のタイムスタンプが続かない行。したがって、例は次のように出力する必要があります

--- Day changed Thu Jul 05 2012
16:54 <@Hamatti> who let the dogs out
--- Day changed Sun Jul 08 2012
12:11 <@Hamatti> dogs are fun

役に立たないすべての偽情報を取り除くために。

編集。T. Zeliekeの回答の後、私はこれをもっとワンライナーにすることができることに気づきました。そこで、ログファイルが2回繰り返されるのを防ぐために、次を使用します。

query=$1
egrep "$query|Day changed" logfile |grep -B1 "^[^-]" |sed '/^--$/d'
4

2 に答える 2

2
grep -B1 "^[^-]" data |sed '/^--$/d'

これはgrep、ダッシュ()で始まらない行をフィルタリングするために使用されます"^[^-]"-B1一致する直前の行を印刷するように要求します。
残念ながらgrep、各一致(2行のペア)は1行で区切られ--ます。したがって、私sedはそれらのsuperflouosラインを取り除くために出力をパイプで通します。

于 2012-08-14T21:27:39.190 に答える
2

これがawkを使用したものです。

awk -v query="$1" '/^--- Day changed/{day=$0;next} $0 ~ query {if (day!=p) {print day;p=day}; print}'

「変更された日」の行が見つかるたびに、それを変数に格納しますday。次に、クエリに一致するものが見つかると、現在保存されている日行が最初に出力されます。同じ日に複数の一致がある場合、変数pは、日行がすでに印刷されているかどうかを判別するために使用されます。

于 2012-08-14T22:51:28.587 に答える