177

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

ファイルはこんな感じ。さらに 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 を出力しますが、何も出力されません。

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

4

11 に答える 11

258

バッファリングのため、何も表示されません。十分な行があるか、ファイルの終わりに到達すると、出力が表示されます。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、最初にファイルを検索してから最後の行を表示することで解決できます。

awk '/A1/ {print $NF}' file | tail -n1
于 2012-10-24T09:17:30.813 に答える
13

を使用した片道awk

tail -f file.txt | awk '/A1/ { print $NF }'
于 2012-10-24T10:13:13.247 に答える
12

いくつかのパイプだけで awk なしでこれを行うことができます。

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev
于 2012-10-24T09:22:17.670 に答える
4

多分これは動作しますか?

grep A1 file | tail -1 | awk '{print $NF}'
于 2012-10-24T09:19:22.130 に答える
2

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

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'
于 2012-10-24T10:29:48.780 に答える
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

$
于 2019-02-09T14:08:18.483 に答える
0

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

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

そして、あなたが探しているものを手に入れるでしょう。

于 2013-01-31T17:14:13.563 に答える
-3

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

于 2017-02-23T19:38:36.840 に答える