Saya tailing file log dengan flag -f. Lalu saya memipiskan ini ke grep, untuk menemukan hanya garis yang berisi "X". Itu bekerja dengan sangat baik. Sekarang saya ingin pipa ini lagi ke grep lain, yang akan menghapus semua baris yang mengandung "Y". Ketika saya menambahkan pipa kedua, file berhenti menyegarkan dan sepertinya tidak ada data yang datang.
Ini adalah perintah yang berfungsi: tail -f my_file.log | grep "X"
Ini adalah perintah yang tidak: tail -f my_file.log | grep "X" | grep -v "Y"
Bagaimana saya harus menyusun ini sehingga perintah itu berfungsi?
command-line
grep
Ori Horev
sumber
sumber
tail -f file|grep -v "Y"
. jika outputnya ok maka lanjutkan untuk menambahkangrep "X"
.Jawaban:
Karena output dari
grep
buffered, gunakan--line-buffered
opsigrep
untuk mengaktifkan line buffering:Jika Anda
grep
tidak memiliki opsi, Anda dapat menggunakanstdbuf
sebagai alternatif:sumber
stdbuf
memberitahulibstdbuf.so
pengaturan mana yang digunakan.diff -u <(env) <(stdbuf env)
dan tidak menemukannya. Tetapi sekarang saya menyadari bahwa apa yang seharusnya saya uji adalahdiff -u <(env) <(stdbuf -oL env)
.tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb'
tidak memberikan output apa pun. Bisakah bantu saya.Saya biasanya merasa lebih berguna
awk
untuk pemeriksaan logis semacam ini:Diuji dengan memiliki dua tab, satu di mana saya terus menulis
seq 20 >> myfile
dan yang lainnya misalnyatail -f myfile | awk '/3/ && !/13/'
.sumber
Pendekatan lain adalah menggunakan
grep
doa tunggal alih-alih dua dan karenanya menghindari masalah buffering. Cukup gunakan ekspresi reguler yang cocok dengan garis yang terdiri dari 0 atau lebih karakter non-Y, lalu X dan kemudian 0 atau lebih non-Ys lagi hingga akhir baris "sumber