我有一个简单的脚本可以解析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的回答之后,我意识到我可以使它更像是一个单行,所以我现在使用以下内容来保存logfile不被迭代两次。
query=$1
egrep "$query|Day changed" logfile |grep -B1 "^[^-]" |sed '/^--$/d'
答案 0 :(得分:2)
grep -B1 "^[^-]" data |sed '/^--$/d'
这使用grep
来过滤不以破折号("^[^-]"
)开头的行。 -B1
要求在比赛前打印直线
不幸的是,grep
将每个匹配(两条线对)分隔为--
行。因此,我通过sed
管道输出以摆脱那些超级流水线。
答案 1 :(得分: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
用于确定是否已经打印了日线。