Saya mencoba mengambil aliran teks langsung netcat
, tetapi tidak berhasil untuk saya:
netcat localhost 9090 | grep sender
tidak mengembalikan apa-apa, tapi saya yakin itu harus.
Jika saya mengarahkan netcat
output ke file dan menambahkan beberapa penundaan (mensimulasikan lingkungan nyata) - maka itu berfungsi:
$ (sleep 5; cat netcat_output; sleep 5) | grep sender
{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}
Saya juga mencoba menambahkan --line-buffered
tetapi tanpa keberhasilan.
Apa yang saya lakukan salah?
Edit:
Saya perhatikan masalah yang sama dengan sed
, outputnya kosong.
Tetapi, misalnya, hexdump
mengubah teks menjadi hex live:
$ netcat localhost 9090 | hexdump -C
00000000 7b 22 6a 73 6f 6e 72 70 63 22 3a 22 32 2e 30 22 |{"jsonrpc":"2.0"|
00000010 2c 22 6d 65 74 68 6f 64 22 3a 22 50 6c 61 79 65 |,"method":"Playe|
00000020 72 2e 4f 6e 50 6c 61 79 22 2c 22 70 61 72 61 6d |r.OnPlay","param|
00000030 73 22 3a 7b 22 64 61 74 61 22 3a 7b 22 69 74 65 |s":{"data":{"ite|
00000040 6d 22 3a 7b 22 69 64 22 3a 36 2c 22 74 79 70 65 |m":{"id":6,"type|
00000050 22 3a 22 6d 6f 76 69 65 22 7d 2c 22 70 6c 61 79 |":"movie"},"play|
00000060 65 72 22 3a 7b 22 70 6c 61 79 65 72 69 64 22 3a |er":{"playerid":|
00000070 31 2c 22 73 70 65 65 64 22 3a 31 7d 7d 2c 22 73 |1,"speed":1}},"s|
stdbuf -o0 netcat localhost 9090 | grep sender
(diambil dari sini )netcat -z localhost 9090 | grep sender
grep
mungkin menunggu tanpa akhir untuk baris baru.cat
berfungsi karenagrep
akan mendapatkan EOF jika bukan baris baru, setidaknya. Mungkin cobaawk
dengan{
RS?Jawaban:
Anda bisa menggunakan
read
perintah (bash
builtin) untuk memaksa karakter dibaca satu per satu:Script ini harus mencetak setiap output penuh dengan balancing
{
dan}
, tetapi Anda dapat mengubah script untuk melakukan apa pun yang Anda inginkan. Skrip ini TIDAK akan bekerja dengan baik pada patokan dibandingkan dengan apa pun, tetapi cukup sederhana dan tampaknya bekerja untuk saya ...Perhatikan bahwa sampel uji Anda tidak memiliki kecocokan
{
dan}
, jadi jika ini adalah kasus dari input nyata, Anda mungkin ingin mengubah kriteria untuk mencetak baris.sumber
Jawabannya ada di sini: grep tidak cocok dengan output nc
netcat menampilkan log verbose ke standard error, jadi kita perlu menangkap kesalahan sebelum kita melakukan pipe ke grep.
sumber
2>&1
, sepertinya grep tidak bekerja sama sekali.Saya pikir masalahnya adalah tidak adanya baris baru dalam
netcat
output. Saya dapat melihat dua solusi:Masukkan baris baru setiap
x
detik (dengan konsekuensi yang tidak menguntungkan jika baris baru dimasukkan di tengahsource
):Gunakan
awk
dengan RS selain baris baru:sumber
cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'
Outputnya ok:,"sender":"xbmc"}
Tambahkan
--line-buffered
untuk menggunakan garis buffering pada output:sumber
gunakan
watch
perintah:sumber
Sesuai komentar @ user43791 , coba nonaktifkan buffering di dalam pipa , mis .:
sumber
Di Bash Anda dapat menggunakan file perangkat semu untuk membuka koneksi TCP dan menerima seperti biasa. Sebagai contoh:
Untuk mengujinya, jalankan server yang dapat mengirim beberapa file, seperti:
Kemudian di terminal lain jalankan tes ke
grep
output:sumber