从输出中搜索并打印可能包含错误的行

从输出中搜索并打印可能包含错误的行

我有一个命令示例,

device list

这使得所有设备都具有地位作为正常或错误采用以下格式

[okay     ]:  you are listening on : 11
[error    ]:  not currently listening: 22
[error    ]:  not currently listening: 33
[okay     ]:  you are listening on : 111

我只想打印状态为好的

我尝试使用grep命令为

device list | grep -r 'okay'
device list | grep -r '[okay     ]'
device list | grep -r '^okay'
device list | grep  'okay'

但它没有打印任何输出。我如何打印状态为好的。

提前致谢。

答案1

在这种情况下,您不必使用-r选项grep,因为(查看man grep):

-r, --recursive
              Read all files  under  each  directory,  recursively,  following
              symbolic  links  only  if they are on the command line.  This is
              equivalent to the -d recurse option.

您还必须重定向标准输出中的错误,并grep使用以下命令将其传输到管道中2>&1重定向:

device list 2>&1 | grep 'okay'

或者你可以使用|&

device list |& grep 'okay'

答案2

从给出的输出来看,至少 的版本grep应该能够工作。如果不能,唯一可能的原因是这个命令不是在 上打印其输出,STDOUT而是在 上打印STDERR。默认情况下,两者都显示在任何终端/控制台上,但像grep通过管道 ( |)获取输入的命令STDOUT只能从 上执行此操作。

解决方案是将的输出重定向STDERRSTDOUT,这就是2>&1|&将执行的操作:

$ device list 2>&1 | grep okay
$ device list |& grep okay

即使您重定向了输出,使用命令的前 3 种形式grep -r也永远不会起作用,STDERR因为该-r选项用于递归到目录和子目录中。因此,即使在管道之后使用,grep -r something也会在您运行命令的所有目录中的文件中搜索某些内容。

答案3

删除-rgrep 命令的选项它就会起作用:

device list | grep 'okay'

-r用于递归搜索。

相关内容