Menggunakan arloji dengan pipa

179

Saya ingin menjalankan perintah ini:

watch -n 1 tail -n 200 log/site_dev.log | grep Doctrine

Tapi itu tidak berjalan, karena "Saya pikir" bahwa grep mencoba berjalan pada jam tangan bukannya pada ekor ...

Apakah ada cara untuk melakukan sesuatu seperti

watch -n 1 (tail -n 200 log/site_dev.log | grep Doctrine)

Terima kasih banyak!

Tommy B.
sumber

Jawaban:

269

Kelilingi perintah dengan tanda kutip

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'
tonylo
sumber
2
Bagaimana jika pipa juga mengandung tanda kutip (seperti awk '{print $3}')? Sunting: Seperti ini
OrangeDog
2
Anda dapat melarikan diri dari karakter tersebut dengan \, yaituwatch -n 'awk \'{print $3}\''
lev
29

Saya mungkin salah, tetapi bukankah ini akan mencapai hal yang sama (melihat baris log yang cocok saat mereka ditambahkan) lebih sederhana?

tail -f -n 200 log/site_dev.log | grep Doctrine
Mitch
sumber
6
Saya setuju ini mungkin lebih efisien sejauh menyangkut CPU, tetapi dalam konteks topik "Menggunakan jam tangan dengan pipa" itu tidak menggunakan jam tangan jadi bukan jawaban. Ini mungkin kasus contoh pertanyaan yang buruk karena arloji dan pipa tampaknya sering muncul tidak dalam konteks ekor.
tudor
1
Tidak, saya pikir Anda membingungkan cara dan akhirnya. Pengguna jelas ingin melihat Doctrinefile yang sedang tumbuh, dan ketika dia melihat di kotak peralatannya, satu-satunya yang dia temukan adalah watch. Apa yang benar-benar perlu dia ketahui adalah tail -f. Lihat juga meta.stackexchange.com/questions/66377/what-is-the-xy-problem
dland
10
Saya pikir ini adalah jawaban yang bisa diterima. Jawaban teratas dan diterima dengan benar menjawab pertanyaan persis yang diajukan, dan jawaban ini dengan benar mengidentifikasi masalah XY yang dibuat OP untuk diri mereka sendiri dan memberikan solusi yang benar-benar mereka inginkan. Kedua jawaban dapat dengan mudah bermanfaat bagi seseorang yang menemukan pertanyaan ini.
cdhowie
2
Saya mencari cara untuk menonton shellcheck *.sh | grep line | wc -ldan jawaban yang diterima bermanfaat bagi saya.
Amedee Van Gasse
2

Anda dapat mengelilingi perintah dengan tanda kutip:

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'

Jika perintah memiliki tanda kutip di dalamnya, Anda dapat menggunakan jenis kutipan yang berbeda dengan melarikan diri yang sesuai:

watch -n 1 $'tail -n 200 log/site_dev.log | fgrep \'Doctrine.*\''

Jika Anda mencoba melakukan sesuatu yang sangat pintar, masukkan perintah atau perintah dalam skrip dan gunakan itu dengan arloji:

cat <<EOF >/tmp/watch-command
tail -n 200 $(pwd)/log/site_dev.log | fgrep Doctrine
EOF
chmod +x /tmp/watch-command
watch /tmp/watch-command

Pastikan untuk memperhitungkan jalur relatif jika perlu.

bschlueter
sumber