Bir dosyadaki bir satırın son sütununu yazdırma


136

Sürekli yazılan / güncellenen bir dosyam var. Belirli bir kelimeyi içeren son satırı bulmak ve ardından o satırın son sütununu yazdırmak istiyorum.

Dosya şuna benzer. Zamanla ona daha fazla A1 / B1 / C1 satırı eklenecektir.

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

Kullanmayı denedim

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

766 değerini yazdırmak için, ancak hiçbir şey çıktısı alınmaz.

Bunu yapmanın bir yolu var mı?

Yanıtlar:


201

Arabelleğe alma yüzünden hiçbir şey görmüyorsunuz. Yeterli satır olduğunda veya dosyanın sonuna ulaşıldığında çıktı gösterilir. tail -fdaha fazla girdi beklemek anlamına gelir, ancak daha fazla hat yoktur fileve bu nedenle boru grepasla kapanmaz.

Eğer atlarsanız -fgelen tailçıkış derhal gösterilmiştir:

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

@ EdMorton tabii ki haklı. AwkA1 , komut satırını kısaltacak şekilde arayabilir .

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

veya kuyruksuz, içeren tüm satırların son sütununu gösterir A1

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

@ MitchellTracy'nin yorumu sayesinde, tailiçeren kaydı kaçırabilir A1ve bu nedenle hiç çıktı alamazsınız. Bu, değiştirerek tailve awkdosyada önce arama yaparak ve ancak daha sonra son satırı göstererek çözülebilir :

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

15
Awk kendi RE karşılaştırmasını yapabildiği için asla grep + awk'a ihtiyacınız yoktur. "grep A1 | awk '{print $ NF}'" sadece "awk '/ A1 / {print $ NF}" "olmalıdır. Ayrıca, tail -f kullanmıyorsanız, o zaman hiç tail'e ihtiyacınız yok, sadece şunu yapabilirsiniz: awk '/ A1 / {f = $ NF} END {print f}' file
— Ed Morton

1
Bu tam olarak doğru değil çünkü sütun, tailraw'un size verdiği pencerede görünmeyebilir . Belli bir sıklıkta görüneceğini bilmediğiniz sürece, daha güvenli olacaktır awk '/A1/ {print $NF}' file | tail -n1.
— Mitchell Tracy


12

Kullanmanın bir yolu awk:

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

Bunun yayınlanan soruna doğru çözüm olduğunu düşündüm (+1!) Ama şimdi soruyu anlamadığımı görüyorum. OP, dosyanın SON SATIRINDAKİ son alanı ister, ancak tail -f kullanıyorsanız SON SATIR yoktur. Belki de dosyadaki ŞU ANDA son satırı kastediyor, bu durumda diğer yorumlarımdan birine bakın.
— Ed Morton

Çok iyi ve basit. Başparmak havaya. awk'S şifreli sözdizimi için
— beğenmeyin

11

Bunu awk olmadan sadece birkaç boru ile yapabilirsiniz.

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

Bu, sorununuzu çözer, ancak gerçekten awk kullanmaz. Umarım senin için yeterince iyidir.
— miono

4

belki bu çalışır?

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

2

Hepsini şurada yapabilirsiniz awk:

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

1
Bölme () ve bir diziye ihtiyacınız yok, sadece son alanı kaydedin ve şunu yazdırın: awk '/ A1 / {f = $ NF} END {print f}' file
— Ed Morton

2

Perl kullanma

$ 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

$

Çok karmaşık görünüyor, sadece yapınperl -lane 'print $F[2] if /A1/' rayne.txt
— Hi-Angel

1
@ Hi-Angel..soru A1'in son oluşumunu sorar. cevabınız tüm eşleşmeleri yazdıracak .. btw cevabımı beğendiyseniz lütfen olumlu oy verin
— stack0114106

1

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

awkAlan ayırıcı ile kullanın -F bir boşluk olarak ayarlayın "".

Deseni $1=="A1" ve eylemi kullanın {print $NF}, bu ilk alanın "A1" olduğu her kayıttaki son alanı yazdıracaktır. Sonucu kuyruğa aktarın ve -n 1yalnızca son satırı gösterme seçeneğini kullanın.


0

Bunu dosyada yürütün:

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

ve aradığınızı alacaksınız.


0

Buradaki asıl mesele değil, ama birisine yardımcı olabilir: awk "{print $NF}"Yapıyordum, yanlış alıntılara dikkat edin. awk '{print $NF}'Kabuğun genişlememesi için olmalı $NF.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.