sed
アプローチは罰金ですが、すべての回線でループしていません。保持する行数がわかっている場合(例としてここでは99を使用しています)、次のようにできます。
sed -i '100,$ d' myfile.txt
説明:sed
は正規表現プロセッサーです。-i
指定されたオプションを使用すると、単にファイルを読み取って結果を標準出力に書き込むのではなく、ファイルを直接処理します(「インライン」)。100,$
「100行目からファイルの終わりまで」という意味です。その後にコマンドが続きd
ます。これは、おそらく「delete」を表すために正しく推測したものです。つまり、コマンドは「100行目からmyfile.txtのファイルの最後までのすべての行を削除する」という意味です。99行を保持するため、100が削除される最初の行です。
編集:一方、たとえば最後の 100行を保持するログファイルがある場合:
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
ここで何が起こっていますか:
[ $(wc -l myfile.txt) -gt 100 ]
:ファイルに100行を超える場合にのみ以下を実行します
$((100 - $(wc -l myfile.txt|awk '{print $1}')))
:削除する行数を計算する(つまり、保持する(最後の)100を除くファイルのすべての行)
1, $((..)) d
:最初の行から計算された行までのすべての行を削除します
編集:質問が編集されて詳細が追加されたため、この追加情報も回答に含めます。追加された事実は次のとおりです。
- 特定のサイズがファイルに残ります(10,000バイト)
- 各行には特定のサイズ(バイト単位)があります(例では300バイト)
これらのデータから、残りの行数を「/」として計算することができます。これは、例では33行を意味します。計算のシェル用語:($((size_to_remain / linesize))
少なくともBashを使用するLinuxでは、結果は整数です)。調整されたコマンドは次のようになります。
# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt
サイズは事前にわかっているので、sed
コマンドに埋め込まれた計算の必要はありません。ただし、柔軟性を高めるために、一部のシェルスクリプト内では変数を使用できます。
ファイルサイズに基づく条件付き処理の場合、次の「テスト」構築を使用できます。
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
つまり、「のサイズ$file
が100kB を超える場合、do ...」(ls -lk
kBの位置5にファイルサイズをリストするため、awk
これを正確に抽出するために使用されます)。