所以基本上我想要做的是使用grep
,sed
或awk
命令(我不挑剔)来执行以下操作。我知道如何从 到 ,Vuln 1
但OS1
不知道反之亦然。
输入:
test.txt
Vuln 1
OS1
OS2
OS3
Vuln 2
OS4
OS5
输出(重伪代码):
$ grep "OS1" test.txt
Vuln 1
答案1
我想,这就是你所需要的:
perl -ne 'chomp; $h=$_ if $_=~/^V/; print $h,"\n" if $_=~/OS1/' test.txt
解释:
perl -ne
逐行读取输入chomp
删除末尾的换行符(不是必需的,但我认为,这样更简洁)- 如果行以以下形式开头,则变量
$h
包含该行的内容V
$h
如果当前行包含OS1
答案2
在这个解决方案中我们使用 GNU AWK。
awk -F"\n" -v RS="" '/OS1/ {print $1}' test.txt
解释
- 我们以空行作为记录分隔符(
RS=""
) -F"\n"
字段之间用换行符 ( )分隔- 程序是:如果我们在记录中找到“OS1”,则打印第一个字段(
/OS1/ {print $1}
)
答案3
你可以做:
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
中。\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