Bash で最初の X 行をスキップした後にファイルを印刷する
巨大なファイルがあり、その内容を表示したいとします。 あなたならどうしますか?
あまり実用的ではないため、ファイルの内容全体を印刷したくないことは明らかです。 いくつかの選択的な行を印刷したいと思うでしょう。 正規表現を使用してファイルを解析し、一致したものだけを出力するかもしれません。
この記事では、そのためのいくつかの方法について説明します。
head
コマンドと tail
コマンドを使用して行をスキップする
以下の例では、最も一般的に使用される 5つの Bash コマンドを使用しています。
tail fileName.txt
head fileName.txt
tail -n fileName.txt # here n is an integer
head -n fileName.txt # here n is an integer
tail +n fileName.txt # prints all lines starting from
# the nth file
tail
コマンドはファイルの最後の 10 行を出力し、head
コマンドはファイルの最初の 10 行を出力します。
tail
コマンドを –n
オプションとともに使用すると、最後の n
行が表示されます。 逆に、head
コマンドに –n
オプションを指定すると、最初の n
行が表示されます。
ここで、n
は整数であるため、コマンドを実行するときは、n
を整数に置き換える必要があることに注意してください。
5 番目の方法はややトリッキーです。 最初の (n – 1)
行を無視し、その後のすべての行を出力します。
vim
を使用して最初の n
行をスキップする
Vim エディターを使用して、最初の n
行をスキップすることもできます。 Vim は、任意のテキスト ドキュメントを非常に効率的に作成および変更できるコンソール ベースのテキスト エディターです。
初めて Vim を使用するには、インストールする必要があります。 これを行うには、次のコマンドを使用します。
sudo apt install vim
Vim がインストールされたので、Vim を使用して最初の n
行をスキップするという目的のビジネス部分に取りかかります。
中間ファイルを使用して実行します。 まず、古いファイルの内容を新しいファイルにコピーします。 次に、新しいファイルの最初の n
行を削除します。
入力と出力のリダイレクトを使用して、あるファイルの内容を別のファイルにコピーします。 オペレーティング システムのコースを学習したことがあれば、ppfdt
テーブル (プロセス ファイル記述子テーブル) について聞いたことがあるでしょう。
デフォルトでは、最初の記述子は stdin
(またはキーボード) を指し、2 番目の記述子は stdout
(またはモニター) を指し、3 番目の記述子は stderror
を指します。
さらに理解を深めるために、以下のスクリプトを検討してください。
cat 0<old_file.txt 1>new_file.txt # copies old file’s contents to new file
上記のコマンドは、古いファイルの内容を読み取り、それを新しいファイルにコピーします。 ディスクリプタ 0
を使用して読み取り、ディスクリプタ 1
を書き込みに使用する方法に注目してください。
この記述子がわかりにくい場合は、別のものをご用意しています。 以下のコマンドも機能します。
cat <old_file.txt >new_file.txt # copies old file’s contents to new file
cp <old_file.txt >new_file.txt # copies old file’s contents to new file
上記の 2 番目の方法では、copy コマンド (つまり、cp
) を使用していることに注意してください。 ソース ファイルへのパスと宛先ファイルへのパスの 2つの引数を取ります。
これで、ファイルのコピーが完了しました。 Vim で新しいファイルを開き、次のコマンドを使用します。
vim new_file.txt
Shift+Esc を使用して、Vim で次のコマンドを入力します。
:1,nd # here n is an integer number e.g., 2
上記のコマンドは、new_file.txt
の最初の n
行を削除します。 ここで、d
は削除を表します。
sed
を使用して最初の n
行をスキップする
新しいファイルを作成してからその内容を削除するのは面倒です。 さらに、古いファイルが巨大な場合、大量の余分なメモリも消費します。
それでは、同じことを達成するためのより簡単な方法を見てみましょう。
sed 1,nd old_file.txt # here n is an integer
sed
コマンドは古いファイルを変更しないことに注意することが重要です。 むしろ、最初の n
行を削除した後、古いファイルの内容を表示するだけです。