UNIXコマンドラインフィルターを使用して、ファイルの最後のn行を破棄するにはどうすればよいですか?
それはtail
の逆のようなものです:tail
は最初のn行を破棄しますが、残りをパイプしますが、コマンドがすべてをパイプします except最後のn行。
残念ながら、そのようなものは見つかりませんでした-head
も役に立ちません。 [〜#〜] edit [〜#〜]:少なくともSolarisでは負の引数を取りません。
更新:私は主に、最後の数分を除いて何が起こったのかを調査したい、大きなファイル、つまりログファイルで機能するソリューションに興味があります。
GNU head
がある場合、
head -n -5 file.txt
file.txt
の最後の5行を除くすべてを印刷します。
head -n
が負の引数を取らない場合は、
head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt
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
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
で機能します。
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
[〜#〜] 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ライクなオペレーティングシステムで使用されます。
tail -n
は負の引数を取りません
tac file.txt | tail -n +6 | tac
これは最後の5行を削除します