在匹配前搜索单词和行的Grep

4

我是一个文本日志文件,其中包含多个类似以下条目的内容:

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匹配之前以Processing开头的行。

我应该如何使用grep或类似sed或awk的其他工具来实现这一点?

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

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

但是现在每次匹配,我需要从日志文件中获取前面的文件名。非常感激任何帮助。
3个回答

3
假设文件名中没有空格,awk 可以胜任。
awk '/^Processing/{file=$2};/FULL FILE OUTPUT$/{print file}' output.txt

} 后面不需要加上 ; - Jotne

0

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

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

匹配任何包含FULL FILE OUTPUT的行,然后取得匹配后的下一行并找到你的文件名。


我认为这个不起作用;具体来说,他想要在“FULL FILE OUTPUT”行之前的“Processing”行;之后的那一行是下一个文件的。 - Doktor J

0

你可以像你要求的那样使用 grep 来实现...

首先提取以 Processing 开头和包含 FULL FILE 的行,但筛选掉我们不知道长度的所有其他内容。这样,你想要的文件名将出现在紧接着 FULL FILE 行之前的行上。

egrep "^Processing|FULL FILE" output.txt

现在进行另一个 grep,但使用 -B1 获取 "FULL FILE" 前一行,然后删除 FULL FILE 行。
egrep "^Processing|FULL FILE” output.txt | grep -B1 "FULL FILE" | grep "^Processing“

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接