grep が検索語を含まない出力を表示するのはなぜですか?

grep が検索語を含まない出力を表示するのはなぜですか?

sensuサービスがインストールされているかどうかを確認したい。このコマンドを実行したservice --status-all| grep sensuところ、出力は次のようになった。

vagrant@vagrant-ubuntu-trusty-64:~$ service --status-all| grep sensu
 [ ? ]  apport
 [ ? ]  console-setup
 [ ? ]  cryptdisks
 [ ? ]  cryptdisks-early
 [ ? ]  dns-clean
 [ ? ]  irqbalance
 [ ? ]  killprocs
 [ ? ]  kmod
 [ ? ]  networking
 [ ? ]  ondemand
 [ ? ]  open-vm-tools
 [ ? ]  pppd-dns
 [ ? ]  rc.local
 [ ? ]  screen-cleanup
 [ ? ]  sendsigs
 [ ? ]  umountfs
 [ ? ]  umountnfs.sh
 [ ? ]  umountroot
 [ ? ]  virtualbox-guest-x11

grep上記の行のどれにも検索語「sensu」が含まれていないため、すべての行がフィルタリングされないのは非常に奇妙だと思います。

問題は、なぜかということです。

答え1

いくつかのサービスは、そのステータスを stderr に報告しているようです:

$ service --status-all 2>&1 | wc -l
43
$ service --status-all 2>/dev/null | wc -l
28
$ service --status-all 2>&1 1>/dev/null | wc -l
15

28 は stdout に、15 は stderr に出力されます。パイプは stdout のみを処理するため、stderr にレポートされるものが表示されます。代わりに、次のようにします。

service --status-all 2>&1| grep sensu

関連情報