sed
アプローチは問題ありませんが、すべての行をループすることはできません。保持したい行数がわかっている場合 (例を示すために、ここでは 99 を使用しています)、次のように行うことができます:
sed -i '100,$ d' myfile.txt
説明:sed
正規表現プロセッサです。オプション -i
付き 与えられた場合、ファイルを直接 (「インライン」) 処理します。ファイルを読み取って結果を標準出力に書き込むだけではありません。 100,$
「100行目からファイルの最後まで」を意味し、その後にコマンド d
が続きます 、おそらく「削除」を表すために正しく推測したでしょう。つまり、このコマンドは、「myfile.txt から 100 行目からファイルの最後までのすべての行を削除する」という意味です。 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 を超える場合は..." (ls -lk
5 番目の位置にファイル サイズが kB でリストされているため、awk
これを正確に抽出するために使用されます)。