grep -A with inverse match - 仅打印出后面字段中的不匹配项

grep -A with inverse match - 仅打印出后面字段中的不匹配项

我有一个文件打印出多次出现的“200 OK”。我只对模式“COMMAND”之后最后出现的“200 OK”感兴趣。在我的特定文件中,“COMMAND”打印了 100 次。它看起来像这样:

otherdata
200 OK
otherdata 
200 OK
COMMAND
200 OK

所以我使用命令。

grep -A1 COMMAND file | grep -v '200 OK' 

这给了我以下输出:

COMMAND xxxxx PASSWORD xxxxxx
--
COMMAND xxxxx PASSWORD xxxxxx
513 unknown user account
--
COMMAND xxxxxx PASSWORD xxxxxx
--
COMMAND xxxxxx PASSWORD xxxxxx
513 unknown user account
--
COMMAND xxxxxx PASSWORD xxxxxxx
--

我得到了除 200 OK 以外的所有内容,但我不需要包含以下内容的行

COMMAND xxxxx PASSWORD xxxxx
---

如何仅获取 200 OK 及其上方行以外的行的输出?理想情况下,我希望我的输出仅包含这样的行,而不包含其他内容。 513 只是一个例子,可能还有其他。

COMMAND xxxxx PASSWORD xxxxxx
513 user account unknown

答案1

你可以这样做sed

sed -n -e '/COMMAND/{N;/200/! p;}' file

默认情况下,这用于-n不打印行,然后如果一行匹配COMMAND,则将该行与下一行连接起来(N如果不匹配,则200打印组合行。

相关内容