Dlaczego to polecenie grep nie działa?

24

Kiedy próbuję użyć grep w ten sposób:

service --status-all | grep network

Nadal wyświetla listę wszystkich usług, mimo że wpakowałem go w grepcelu ograniczenia tylko do ciągu „sieciowego”


Po fakcie:

Zauważyłem ten artykuł, który wyjaśnia, dlaczego polecenie zachowuje się w ten sposób, to właśnie podoba mi się w Linuksie, zawsze jest dobry powód, ale niekoniecznie intuicyjny

Meer Borg
źródło

Odpowiedzi:

41

Próbować:

service --status-all |& grep network

Aplikacje wiersza polecenia mogą drukować na dwóch strumieniach tekstu znanych jako standardowe wyjście ( standardowe wyjście) i standardowy błąd (standardowe). Domyślnie terminal wyświetla identycznie dane wyjściowe dla obu.

Stdout jest podany numer 1, a stderr jest podany numer 2. Domyślnie, operatorów przekierowania, jak >, |i <odnoszą się tylko do stdout, numer 1.

|&potokuje stdout i stderr razem do procesu na standardowym strumieniu wejściowym (stdin) po prawej stronie, co zapewnia greppracę zgodnie z oczekiwaniami.

Nie wiem, dlaczego tutaj service --status-alljest drukowane do stderr, ale ogólnie rzecz biorąc, oddzielny strumień stderr jest bardzo przydatny, ponieważ pozwala zobaczyć błędy, nawet gdy stdout jest wyciszony.

Flimm
źródło
Dzięki za odpowiedź, wydaje się, że wzbudziło to duże zainteresowanie. Myślę, że nie tylko ja miałem ten problem.
Meer Borg,
4

Musisz przekierować standardowy strumień błędów ( 2) na standardowe wyjście ( 1):

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

Operator >zwykle przekierowuje do pliku (np 2>/tmp/file.). Aby przekierować do innego strumienia za pomocą deskryptora , musi być poprzedzony &(nie ma spacji między znakami).

Paweł Nadolski
źródło