web-dev-qa-db-ja.com

Bashの最後から最初までのファイル行を出力する

通常のログリーダーのように、ログファイルの最後の10行を表示します最後の行から開始-これはtailコマンドのバリエーションだと思いましたが、どこにもありません。

32
Yarin

最終的にtail -r、これは私のOSXで機能しました(tacは機能しません)

tail -r -n10
8
Yarin

GNU(Linux)以下を使用

tail -n 10 <logfile> | tac

tail -n 10 <logfile>はログファイルの最後の10行を出力し、tac(逆スペルの猫)は順序を逆にします。

BSD(OS X)tail-rオプションを使用:

tail -r -n 10 <logfile>

両方の場合、次を試すことができます:

if hash tac 2>/dev/null; then tail -n 10 <logfile> | tac; else tail -n 10 -r <logfile>; fi

注:GNUマニュアルの状態 BSD -rオプションは、最大でバッファとして大きく、通常は32 KiB "であり、tacはより信頼性があります。バッファサイズが問題であり、tacを使用できない場合、bashで機能を書き込む @ ata's answer を使用することを検討できます。

47
Rick Smith

tacはあなたが望むことをします。 catの逆です。

tail -10 logfile | tac

13
drysdam

あなたは純粋なbashでそれを行うことができます:

#!/bin/bash
readarray file
lines=$(( ${#file[@]} - 1 ))
for (( line=$lines, i=${1:-$lines}; (( line >= 0 && i > 0 )); line--, i-- )); do
    echo -ne "${file[$line]}"
done

./tailtac 10 <somefile

./tailtac -10 <somefile

./tailtac 100000 <somefile

./tailtac <somefile

2
ata

これは、出力を逆順に印刷するのに最適な方法です

tail -n 10 <logfile>  | tac
2