常に書き込み/更新されているファイルがあります。特定の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を印刷しますが、何も出力されません。
これを行う方法はありますか?
バッファリングのため、何も表示されません。十分な行があるか、ファイルの終わりに達すると、出力が表示されます。 tail -f
は、さらに入力を待つことを意味しますが、file
には行がもうないため、grep
へのパイプは閉じられません。
tail
から-f
を省略すると、出力がすぐに表示されます。
tail file | grep A1 | awk '{print $NF}'
@EdMortonはもちろん正しい。 Awk はA1
も検索できるため、コマンドラインが
tail file | awk '/A1/ {print $NF}'
または末尾なしで、A1
を含むすべての行の最後の列を表示します
awk '/A1/ {print $NF}' file
@MitchellTracyのコメントのおかげで、 tail
はA1
を含むレコードを見逃す可能性があり、出力がまったく得られない可能性があります。これは、tail
とawk
を切り替えて、最初にファイルを検索してから最後の行を表示するだけで解決できます。
awk '/A1/ {print $NF}' file | tail -n1
行の最後の列を印刷するには、$(NF)を使用します。
awk '{print $(NF)}'
これは、いくつかのパイプを使用してawkなしで実行できます。
tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev
awk
を使用する1つの方法:
tail -f file.txt | awk '/A1/ { print $NF }'
多分これは動作しますか?
grep A1 file | tail -1 | awk '{print $NF}'
すべてをawk
で実行できます。
<file awk '$1 ~ /A1/ {m=$NF} END {print m}'
awk -F " " '($1=="A1") {print $NF}' FILE | tail -n 1
フィールド区切り文字-Fをスペース ""に設定してawk
を使用します。
pattern$1=="A1"
およびaction{print $NF}
を使用すると、最後のフィールドが出力されます最初のフィールドが「A1」であるすべてのレコードで。結果を末尾にパイプし、-n 1
オプションを使用して最後の行のみを表示します。
ls -l | awk '{print $9}' | tail -n1
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
$
ファイルでこれを実行します。
awk 'ORS=NR%3?" ":"\n"' filename
探しているものが手に入ります。