web-dev-qa-db-ja.com

尾の反対:最後のn行を除くすべての行

UNIXコマンドラインフィルターを使用して、ファイルの最後のn行を破棄するにはどうすればよいですか?

それはtailの逆のようなものです:tailは最初のn行を破棄しますが、残りをパイプしますが、コマンドがすべてをパイプします except最後のn行。

残念ながら、そのようなものは見つかりませんでした-headも役に立ちません。 [〜#〜] edit [〜#〜]:少なくともSolarisでは負の引数を取りません。

更新:私は主に、最後の数分を除いて何が起こったのかを調査したい、大きなファイル、つまりログファイルで機能するソリューションに興味があります。

38

GNU headがある場合、

head -n -5 file.txt

file.txtの最後の5行を除くすべてを印刷します。

head -nが負の引数を取らない場合は、

head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt
42
user570500
head file.txt               # first 10 lines
tail file.txt               # last 10 lines
head -n 20 file.txt         # first 20 lines
tail -n 20 file.txt         # last 20 lines
head -20 file.txt           # first 20 lines
tail -20 file.txt           # last 20 lines
head -n -5 file.txt         # all lines except the 5 last
tail -n +5 file.txt         # all lines except the 4 first, starts at line 5
12
Kjetil S.

BSDなどで機能する最後の行を削除する簡単な方法を次に示します。

sed '$d' input.txt

式は「最後の行で、それを削除する」と表示されます。他の行はsedのデフォルトの動作であるため、出力されます。

それらをチェーンして複数の行を削除することができます

sed '$d' input.txt | sed '$d' | sed '$d'

これは確かに少々強引ですが、ファイルを1回だけスキャンします。

あなたはこれを見て、より多くの答えを得ることもできます: https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a -ファイル

ここに私のお気に入りの1つから改造されたワンライナーがあります:

count=10
sed -n -e ':a' -e "1,$count"'!{P;N;D;};N;ba'

私はそれを解読する楽しみがあり、あなたもそうすることを望みます(:スキャン時にN行をバッファーしますが、それ以外はかなり効率的です。

注:!は、Bashによって解釈されないように単一引用符を使用して引用されます(シェルの場合)。全体を囲む二重引用符はshで機能します。

6
jwd

headを選択できない理由を知りたいのですが。

~$ man head
...
-n, --lines=[-]K
        print the first K lines instead of the first 10; 
        with the leading `-', print all but the last K lines of each file

これはあなたの目的に合うようです、例えば:

head -n -20 yourfile.txt
3

[〜#〜] mac [〜#〜]最後のN行を除くすべての行を取得するソリューション:

head -n -5 file.txt

次のエラーが発生するため、機能しません。

head: illegal line count -- -5

解決策の1つは、coreutilsをインストールしてgheadを実行することです。

brew install coreutils
ghead -n -5 file.txt

GNU Core Utilitiesまたはcoreutilsは、GNUソフトウェアのパッケージであり、cat、ls、rmなどの基本的なツールの多くがUnixライクなオペレーティングシステムで使用されます。

2
MikeL

tail -nは負の引数を取りません

tac file.txt | tail -n +6 | tac

これは最後の5行を削除します

0
atw31337