2014-12-26 3 views
4

У меня есть файл журнала текст, содержащий несколько записей, как это: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.

Как это сделать с помощью grep или другого инструмента, такого как sed или awk?

До сих пор я в состоянии соответствовать каждый случай ПОЛНЫЙ файл найден в журнале и сосчитать их:

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

, но мне нужно, чтобы получить предыдущее имя файла из файла журнала теперь для каждого матча.

Любая помощь очень ценится.

ответ

3

Предполагая, что нет пробелов в именах файлов, awk бы к нему

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

Вам не нужно ',' после '}' – Jotne

0

Вы можете также использовать СЭД следующим образом:

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

Матчи любой линии с FULL FILE OUTPUT, а затем взять на следующую строку после матча и найдите свое имя файла.

+0

Я надеваю Думаю, это работает; в частности, он хочет, чтобы строка «Обработка» ** была до ** строки «FULL FILE OUTPUT»; один после него для следующего файла –

0

Вы действительно можете сделать это с grep как вы спросили ....

Первый экстракт только строки, начинающиеся Processing и строки, содержащие FULL FILE но отсеять все другие вещи, которые мы не знаем длину , Таким образом, имя файла, которое вы хотите, будет находиться на линии непосредственно перед линией FULL FILE.

egrep "^Processing|FULL FILE" output.txt 

Теперь сделайте другой grep, но получить линию до «полного файла» с помощью -B1, а затем удалить FULL FILE линии

egrep "^Processing|FULL FILE” output.txt | grep -B1 "FULL FILE" | grep "^Processing“ 
Смежные вопросы