我有一个命令示例,
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
只能从 上执行此操作。
解决方案是将的输出重定向STDERR
到STDOUT
,这就是2>&1
或|&
将执行的操作:
$ device list 2>&1 | grep okay
$ device list |& grep okay
即使您重定向了输出,使用命令的前 3 种形式grep -r
也永远不会起作用,STDERR
因为该-r
选项用于递归到目录和子目录中。因此,即使在管道之后使用,grep -r something
也会在您运行命令的所有目录中的文件中搜索某些内容。
答案3
删除-r
grep 命令的选项它就会起作用:
device list | grep 'okay'
-r
用于递归搜索。