web-dev-qa-db-ja.com

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

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

ファイルは次のようになります。 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を印刷しますが、何も出力されません。

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

93
Rayne

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

tailから-fを省略すると、出力がすぐに表示されます。

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

@EdMortonはもちろん正しい。 AwkA1も検索できるため、コマンドラインが

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

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

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

@MitchellTracyのコメントのおかげで、 tailA1を含むレコードを見逃す可能性があり、出力がまったく得られない可能性があります。これは、tailawkを切り替えて、最初にファイルを検索してから最後の行を表示するだけで解決できます。

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

行の最後の列を印刷するには、$(NF)を使用します。

awk '{print $(NF)}' 
12

これは、いくつかのパイプを使用してawkなしで実行できます。

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

awkを使用する1つの方法:

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

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

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

すべてをawkで実行できます。

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

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

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

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

0
JimBob

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

0
Cristian

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

$
0
stack0114106

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

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

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

0
Aziz