Saya ingin mendapatkan nomor rating
sebagai keluaran dari ini
# nc localhost 9571
language:
language:en_ZA.UTF-8
language:en_ZW.UTF-8
session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome
session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome
session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome
xsession:/etc/X11/Xsession
rating:94
Saya bisa melakukannya seperti ini
# nc localhost 9571 | grep rating | cut -d: -f2
94
tetapi dapat awk
digunakan sebagai gantinya untuk solusi yang lebih sederhana?
Jawaban:
sumber
awk -F: '$1 == "rating" {print $2}'
awk -F: '/^rating:/ { print $2 }'
?Quanta mengalahkan saya untuk itu, tapi saya akan memasukkan
sed
varian jika Anda cenderung:Ditto apa yang dikatakan MadHatter. Solusi Anda saat ini sangat baik. (Meskipun saya akan menerima
"^rating:"
bukan hanya kata untuk memastikan Anda hanya mendapatkan baris yang Anda inginkan.)sumber
sed
! Hal ini sangat kurang dimanfaatkan dan kurang dihargai ...Anda juga bisa menggunakan shell:
sumber
nc
. Bagus!ya, Anda bisa (dan harus) menggunakan (satu) awk alih-alih (dua) grep dan cut:
Pastikan untuk mencocokkan baris Anda sebaik yang Anda bisa untuk menghindari bug jelek.
/rating/
bekerja,/^rating/
lebih baik (lebih aman),/^rating:/
adalah yang terbaik (dalam hal ini).sumber
Bisa:
(Saya tidak tahu apa yang Anda lakukan dengan localhost di atas, jadi gunakan output Anda sebagai input ke perintah awk saya, lalu ganti "cat" dengan "nc ..." - tetapi seharusnya tidak masalah.)
Tetapi mengapa Anda melakukan ini? Cara UNIX adalah memiliki banyak alat kecil, yang masing-masing melakukan satu hal dengan baik, diikat bersama melalui saluran pipa, daripada menggunakan alat multifungsi yang lebih besar. Anda harus memilih satu baris yang cocok, bidang yang dipilih darinya:
grep
memilih garis dengan yang cocok, dancut
memilih bidang dari jalur input; mereka sempurna untuk tugas itu. Tetapi jika Anda benar-benar ingin melakukan semuanya dengan awk, well, begitulah.sumber
grep
dancut
membutuhkan pemijahan dua proses, dan menggunakanawk
(ataused
) hanya membutuhkan satu. Menghasilkan suatu proses mahal secara komputasi. Juga, tidak seperti menggunakanperl
atauruby
(et al),sed
danawk
jauh lebih ringan di bagian depan.Sementara jawaban quanta adalah yang termudah dan yang akan saya tulis juga, saya yakin Anda tidak tahu GNU awk (gawk) dapat melakukan networking juga ? Anda dapat menulis semuanya dengan awk jika Anda benar-benar ingin:
Ini mungkin berguna jika server tidak menginstal nc, nc memiliki perms terbatas, atau jika Anda benar-benar suka awk.
sumber
Anda juga dapat menggunakan sed,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"
Ini akan memastikan bahwa "peringkat" memulai garis, dan angka itu mengikuti
rating:
sumber
Jika Perl adalah opsi:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a
autosplits setiap baris ke dalam@F
array-F:
menggunakan:
sebagai pemisah bidang, bukan default ruang kosong/rating/
mengembalikan true jika regex ditemukan$F[1]
adalah elemen ke-2 dari@F
array.Perl array dimulai dengan elemen 0, sedangkan awk dimulai dengan $ 1
sumber