Mencetak kolom terakhir dari sebuah baris dalam file


135

Saya memiliki file yang terus-menerus ditulis / diperbarui. Saya ingin menemukan baris terakhir yang mengandung kata tertentu, lalu mencetak kolom terakhir dari baris itu.

File terlihat seperti ini. Lebih banyak garis A1 / B1 / C1 akan ditambahkan ke sana seiring waktu.

A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434

Saya mencoba menggunakan

tail -f file | grep A1 | awk '{print $NF}'

untuk mencetak nilai 766, tetapi tidak ada output.

Apakah ada cara untuk melakukan ini?

Jawaban:


199

Anda tidak melihat apa-apa, karena buffering. Output ditampilkan, ketika ada cukup garis atau akhir file tercapai. tail -fberarti menunggu input lebih banyak, tetapi tidak ada lagi garis masuk filedan pipa greptidak pernah ditutup.

Jika Anda menghilangkan -fdari tailoutput ditampilkan segera:

tail file | grep A1 | awk '{print $NF}'

@ Edorton benar tentu saja. Awk juga dapat mencari A1, yang mempersingkat baris perintah

tail file | awk '/A1/ {print $NF}'

atau tanpa ekor, menunjukkan kolom terakhir dari semua baris yang mengandung A1

awk '/A1/ {print $NF}' file

Berkat komentar @ MitchellTracy, tailmungkin ketinggalan catatan yang berisi A1dan karenanya Anda tidak mendapatkan hasil sama sekali. Ini dapat diselesaikan dengan beralih taildan awk, mencari terlebih dahulu melalui file dan hanya kemudian menunjukkan baris terakhir:

awk '/A1/ {print $NF}' file | tail -n1

14
Anda tidak perlu grep + awk karena awk dapat melakukan perbandingan RE sendiri. "grep A1 | awk '{print $ NF}'" seharusnya menjadi "awk '/ A1 / {print $ NF}'" ". Juga, jika Anda tidak menggunakan tail -f maka Anda tidak perlu tail sama sekali, Anda hanya bisa melakukannya: awk '/ A1 / {f = $ NF} File END {print f}'
Ed Morton

Ini tidak tepat, karena kolom mungkin tidak muncul di jendela yang mentah tailberikan kepada Anda. Kecuali Anda tahu itu akan muncul dengan frekuensi tertentu, itu akan lebih aman awk '/A1/ {print $NF}' file | tail -n1.
Mitchell Tracy


12

Salah satu cara menggunakan awk:

tail -f file.txt | awk '/A1/ { print $NF }'

Saya pikir itu solusi yang tepat untuk masalah yang diposting (+1!) Tapi sekarang saya melihat saya tidak mengerti pertanyaannya. OP ingin bidang terakhir dari LAST LINE dari file tersebut, tetapi tidak ada LAST LINE jika Anda menggunakan tail -f. Mungkin dia berarti baris terakhir SAAT INI dalam file, dalam hal ini lihat salah satu komentar saya yang lain.
Ed Morton

Sangat bagus dan sederhana. Jempolan. Jempol ke bawah untuk awksintaksis samar :)
stamster

11

Anda dapat melakukan ini tanpa awk hanya dengan beberapa pipa.

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev

Ini menyelesaikan masalah Anda, tetapi tidak benar-benar menggunakan awk. Semoga ini cukup baik untukmu.
miono

4

mungkin ini berhasil?

grep A1 file | tail -1 | awk '{print $NF}'

2

Anda dapat melakukan semuanya di awk:

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'

1
Anda tidak perlu split () dan sebuah array, cukup simpan kolom terakhir dan cetak itu: awk '/ A1 / {f = $ NF} file END {print f}'
Ed Morton

2

Menggunakan Perl

$ cat rayne.txt
A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434


$ perl -lane ' /A1/ and $x=$F[2] ; END { print "$x" } ' rayne.txt
766

$

Terlihat terlalu rumit, cukup lakukanperl -lane 'print $F[2] if /A1/' rayne.txt
Hi-Angel

1
@ Hai-Malaikat..pertanyaan itu menanyakan kemunculan A1 terakhir. jawaban Anda akan mencetak semua kecocokan .. btw jika Anda menyukai jawaban saya, mohon
jawabnya

1

awk -F " " '($1=="A1") {print $NF}' FILE | tail -n 1

Gunakan awkdengan pemisah bidang -F set ke spasi "".

Gunakan pola $1=="A1" dan tindakan {print $NF} , ini akan mencetak bidang terakhir di setiap catatan di mana bidang pertama adalah "A1". Pipa hasilnya menjadi ekor dan gunakan -n 1opsi untuk hanya menampilkan baris terakhir.


0

Jalankan ini pada file:

awk 'ORS=NR%3?" ":"\n"' filename

dan Anda akan mendapatkan apa yang Anda cari.


0

Bukan masalah aktual di sini, tapi mungkin bisa membantu seseorang: Saya lakukan awk "{print $NF}", perhatikan kutipan yang salah. Seharusnya awk '{print $NF}', agar shell tidak mengembang $NF.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.