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?

Rayne
sumber

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
Olaf Dietsche
sumber
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
27

Untuk mencetak kolom terakhir dari sebuah baris cukup gunakan $ (NF):

awk '{print $(NF)}' 
Gennadiy Zolotaryov
sumber
12

Salah satu cara menggunakan awk:

tail -f file.txt | awk '/A1/ { print $NF }'
Steve
sumber
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
miono
sumber
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}'
hgh
sumber
2

Anda dapat melakukan semuanya di awk:

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'
Thor
sumber
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

$
stack0114106
sumber
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.

JimBob
sumber
0

Jalankan ini pada file:

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

dan Anda akan mendapatkan apa yang Anda cari.

Aziz
sumber
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.

delucasvb
sumber
-2

ls -l | awk '{print $9}' | tail -n1

Cristian
sumber
1
Bagaimana ini bahkan terkait dengan pertanyaan OP?
Hickory420