ファイルの行の最後の列を印刷する


135

常に書き込み/更新されているファイルがあります。特定の単語を含む最後の行を見つけて、その行の最後の列を印刷します。

ファイルは次のようになります。さらにA1 / B1 / C1行が追加されます。

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

使ってみた

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

値766を出力しますが、何も出力されません。

これを行う方法はありますか?

回答:


199

バッファリングのため、何も表示されません。十分な行があるか、ファイルの終わりに達すると、出力が表示されます。tail -fより多くの入力を待つことを意味しますが、ラインがなくなるfileため、パイプgrepが閉じられることはありません。

出力-fから省略しtailた場合、すぐに表示されます:

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

もちろん@EdMortonは正しいです。AwkA1同様に検索できるため、コマンドラインが次のように短縮されます。

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

または尾なし、を含むすべての行の最後の列を表示 A1

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

@MitchellTracyのコメントのおかげでtail、レコードが含まれていない可能性A1があり、出力がまったく得られません。これは、スイッチングによって解決することができるtailawk、ファイルを介して第1の検索だけにして最後の行を示しています。

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

14
awkは独自のRE比較を実行できるため、grep + awkは必要ありません。"grep A1 | awk '{print $ NF}'"は、 "awk '/ A1 / {print $ NF}'"にする必要があります。また、tail -fを使用していない場合は、tailはまったく必要ありません。yoiuは次のようにできます:awk '/ A1 / {f = $ NF} END {print f}' file
Ed Morton

raw tailが提供するウィンドウに列が表示されない可能性があるため、これは正しくありません。特定の頻度で表示されることがわかっている場合を除いて、の方が安全awk '/A1/ {print $NF}' file | tail -n1です。
Mitchell Tracy


12

使用する1つの方法awk

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

投稿された問題(+1!)の正しい解決策だと思っていましたが、質問が理解できません。OPはファイルの最後の行の最後のフィールドを必要としますが、tail -fを使用している場合、最後の行はありません。多分彼はファイルの最後の行を現在意味しているかもしれません、その場合私の他のコメントの1つを見てください。
Ed Morton

とても良くてシンプルです。いいぞ。以下のためダウン親指awkの不可解な構文:)
stamster

11

これは、awkを使用せずに、パイプをいくつか使用するだけで実行できます。

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

これはあなたの問題を解決しますが、実際にはawkを使用しません。とにかくそれで十分だといいのですが。
miono 2012年

4

多分これはうまくいきますか?

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

2

あなたはそれをすべて行うことができますawk

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

1
split()と配列は必要ありません。最後のフィールドを保存して出力するだけです。awk '/ A1 / {f = $ NF} END {print f}'ファイル
Ed Morton

2

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

$

複雑すぎるように見える、ただやるperl -lane 'print $F[2] if /A1/' rayne.txt
Hi-Angel

1
@ Hi-Angel ..質問は、A1の最後の出現を要求します。あなたの答えはすべての一致を出力します。私の答えが気に入ったら、それをplsで
投票し

1

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

awkフィールド区切り文字-Fと共に使用をスペース ""に設定して。

パターン $1=="A1"アクションを 使用します{print $NF}。これにより、最初のフィールドが「A1」であるすべてのレコードの最後のフィールドが印刷されます。結果を末尾にパイプし、-n 1オプションを使用して最後の行のみを表示します。


0

これをファイルで実行します。

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

探しているものが手に入ります。


0

ここでは実際の問題ではありませんが、誰かを助けるかもしれません:私がやっていたawk "{print $NF}"、間違った引用符に注意してください。awk '{print $NF}'シェルが展開しないようにする必要があります$NF


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.