Grep在比赛前的单词和线

时间:2014-12-26 16:14:56

标签: regex linux bash awk grep

我有一个文本日志文件,其中包含多个这样的条目:

Processing input.jpg (323 of 500)...
Detecting matches in region 1...
Detecting matches in region 2...
Detecting matches in region 3...
Detecting matches in region 4...
Detecting matches in region (n)...
...
NOT ENOUGH MATCHES - FULL FILE OUTPUT
Processing input1.jpg (324 of 500)...

我想grep文件以匹配序列FULL FILE出现的每个实例,然后获取生成该结果的文件的名称 - 即在每个FULL FILE匹配之前找到开始处理的行。

如何使用grep或其他工具(如sed或awk)执行此操作?

到目前为止,我能够匹配在日志中找到FULL FILE的每个实例并计算它们:

cat output.txt | grep "FULL FILE" | wc -l

但我现在需要从日志文件中获取每个匹配的前一个文件名。

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:3)

假设文件名中没有空格,awk将取决于它

awk '/^Processing/{file=$2};/FULL FILE OUTPUT$/{print file}' output.txt

答案 1 :(得分:0)

你也可以按如下方式使用sed:

sed -n '/FULL FILE OUTPUT/{ N;s/.*\nProcessing \(.*\) (.*).*/\1/p}' my_file

将所有行与FULL FILE OUTPUT匹配,然后在匹配后选择下一行并找到您的文件名。

答案 2 :(得分:0)

你可以像你问的那样grep实际做到这一点......

首先只提取以Processing开头的行和包含FULL FILE的行,但要清除所有其他我们不知道其长度的内容。这样,您想要的文件名将位于FULL FILE行之前的行上。

egrep "^Processing|FULL FILE" output.txt

现在再做一次grep,但是在" FULL FILE"之前得到一行。使用-B1,然后移除FULL FILE

egrep "^Processing|FULL FILE” output.txt | grep -B1 "FULL FILE" | grep "^Processing“