LoginSignup
14
14

More than 5 years have passed since last update.

ファイルの途中行を表示する(便利tips集)

Last updated at Posted at 2016-05-10

TL;DR

  • head | tail はやめましょう. bodyコマンドとかいらないです.
  • GNU環境であれば sed -ns "N,M"を使いましょう. (BSDでは-sオプションがない)
  • 少しリッチに操作したいなら awk 'FNR==N,FNR==M'
  • awkは神コマンド

ファイルの○○○行目から○○○行目までを表示したい

何万行もあるファイルの中から一部分だけ確認するときどうしてますか?
head | tailですか?

僕はawkを使います.
sedもいいですね(コマンドが短くて, 早いので)

N行目からM行目まで表示するのに使うコマンドは各自以下の様な感じになります.

tail_and_head
tail -n + $N | head -n $($N-$M) 
sed
sed -sn 'N,Mp' ファイル名
awk
awk 'FNR==N,FNR==M' ファイル名

head | tail は Bad Practice

head | tail はやめましょう理由は簡単

複数ファイル指定ができないからです

つまりこんな感じにファイルを表示できません.
tail -n + $N * | head -n $($N-$M)

あと評価式を挟む必要があるので
個人的な不満として書きづらいです.

sed, awk は Best Practice

sed(GNU), awkならできます

multiple_file_w_sed
sed -sn 'N,Mp' *
multiple_file_w_awk
awk 'FNR==N,FNR==M' *

sedは相対表示が可能

N行より+10行を表示する
sed -sn 'N,+10p' *

リッチな操作をしたいならawk

ファイルの境目に何か出力したい(GNU)

BEGINFILE or ENDFILE を使う
shell-session:multiple_file_w_awk
awk 'BEGINFILE{print FILENAME} ENDFILE{print "\n"} FNR==N,FNR==M' *

ファイルの境目に何か出力したい(BSD)

BEGINFILE or ENDFILE を使う
shell-session:multiple_file_w_awk
awk 'FNR==1{print FILENAME} FNR==N,FNR==M' *

行番号を表示したい

ファイル毎の行番号を表示したいなら FNR.
複数ファイルを通して 行番号を利用したいならば NR
shell-session:multiple_file_w_awk
awk 'FNR==3,FNR==10{print FNR,$0}' *

14
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14