GNU/Linux >> Linux の 問題 >  >> Linux

ファイルを行単位で切り詰めるには?

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 これを正確に抽出するために使用されます)。


Linux
  1. ファイルの行をループする方法は?

  2. テキストファイル内の重複行を削除するにはどうすればよいですか?

  3. ファイルの行数を数えますか?

  1. Vimでファイルのすべての行を削除する方法

  2. UNIX/Linux でファイルの行数を数える方法

  3. ファイルの行数だけを取得する方法

  1. ファイル内で \n を grep する方法

  2. Linuxでファイルを特定のサイズにカットする方法は?

  3. Linuxでテキストファイルから特定の行を表示するには?