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 的回答之后,我意识到我可以使它更像一个单行,所以我现在使用以下内容来保存日志文件免于被迭代两次。

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

2 回答 2

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

这用于grep过滤不以破折号 ( "^[^-]") 开头的行。-B1要求在比赛前打印紧接的行。
不幸的是grep,然后将每个匹配项(两行对)分隔--一行。因此,我通过管道输出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 changed”行时,它都会将其存储在变量中day。然后,当它找到与查询匹配的内容时,它首先输出当前存储的日期行。如果同一天有多个匹配项,则该变量p用于确定是否已经打印了日线。

于 2012-08-14T22:51:28.587 回答