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 を使う
multiple_file_w_awk
awk 'BEGINFILE{print FILENAME} ENDFILE{print "\n"} FNR==N,FNR==M' *
ファイルの境目に何か出力したい(BSD)
BEGINFILE or ENDFILE を使う
multiple_file_w_awk
awk 'FNR==1{print FILENAME} FNR==N,FNR==M' *
行番号を表示したい
ファイル毎の行番号を表示したいなら FNR.
複数ファイルを通して 行番号を利用したいならば NR
multiple_file_w_awk
awk 'FNR==3,FNR==10{print FNR,$0}' *