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.