Так в основном то, что я хочу сделать, использовать a grep
,sed
или awk
команда (я не придирчив), который может сделать следующее. Я знаю, как пойти от Vuln 1
кому: OS1
но не наоборот.
Вход:
test.txt
Vuln 1
OS1
OS2
OS3
Vuln 2
OS4
OS5
Вывод (тяжелый псевдокод):
$ grep "OS1" test.txt
Vuln 1
В этом решении мы используем GNU AWK.
awk -F"\n" -v RS="" '/OS1/ {print $1}' test.txt
Объяснение
RS=""
) -F"\n"
) /OS1/ {print $1}
) Я предполагаю, это - то, в чем Вы нуждаетесь:
perl -ne 'chomp; $h=$_ if $_=~/^V/; print $h,"\n" if $_=~/OS1/' test.txt
Объяснение:
perl -ne
читает вход linewisechomp
удаляет новую строку в конце (не необходимый, но я думаю, это более чисто),$h
содержит содержание строки, если это запускается с V
$h
печатается, если текущая строка содержит OS1
Можно сделать:
grep -Pzo '\n?\KVuln 1(?=\n\s*OS1\n)' test.txt
Мы используем PCRE (-P
) и ASCII NUL как входной разделитель строки (-z
) вместо \n
так, чтобы мы могли соответствовать \n
буквально
\n?\K
будет соответствовать дополнительной новой строке перед нашим желаемым Vuln 1
, \K
отбросит соответствие
(?=\n\s*OS1\n)
нулевая ширина положительный предварительный шаблон, гарантирующий это Vuln 1
сопровождается OS1
в a \n
разделенная строка.
Пример:
$ cat test.txt
Vuln 1
OS1
OS2
OS3
Vuln 2
OS4
OS5
$ grep -Pzo '\n?\KVuln 1(?=\n\s*OS1\n)' test.txt
Vuln 1