删除下一行匹配特定模式的行

时间:2012-08-14 21:19:08

标签: bash

我有一个简单的脚本可以解析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'

2 个答案:

答案 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用于确定是否已经打印了日线。