Mengapa perintah grep ini tidak berfungsi?

24

Ketika saya mencoba menggunakan grep dengan cara ini:

service --status-all | grep network

Itu masih mencantumkan semua layanan meskipun saya menyalurkannya ke grepuntuk membatasi hanya ke string "jaringan"


Setelah Fakta:

Melihat artikel ini yang menjelaskan mengapa perintah berperilaku seperti ini, itulah yang saya sukai tentang linux, selalu ada alasan bagus, tetapi tidak perlu intuitif

Meer Borg
sumber

Jawaban:

41

Mencoba:

service --status-all |& grep network

Aplikasi baris perintah dapat mencetak ke dua aliran teks yang dikenal sebagai standar keluar (stdout) dan kesalahan standar (stderr). Secara default, terminal hanya menampilkan output untuk keduanya secara identik.

Stdout diberi nomor 1, dan stderr diberi nomor 2. Secara default, operator pengalihan, seperti >, |dan <hanya berlaku untuk stdout, nomor 1.

|&pipa baik stdout dan stderr bersama untuk proses pada aliran input standar (stdin) kanan, yang membuat greppekerjaan seperti yang Anda harapkan.

Saya tidak tahu mengapa service --status-allmencetak ke stderr di sini, tetapi secara umum, memiliki aliran stderr terpisah sangat berguna, karena memungkinkan Anda melihat kesalahan bahkan ketika stdout dibungkam.

Flimm
sumber
Terima kasih atas jawabannya, sepertinya ini telah menghasilkan banyak minat. Jadi saya kira saya bukan satu-satunya dengan masalah ini.
Meer Borg
4

Anda perlu mengarahkan aliran kesalahan standar ( 2) ke output standar ( 1):

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

Operator >biasanya mengarahkan ke file (misalnya 2>/tmp/file). Untuk mengalihkan ke aliran lain menggunakan deskriptor , perlu didahului dengan &(perhatikan tidak ada spasi di antara karakter).

Paweł Nadolski
sumber