テキストファイルの特定行を取得する方法

Linux だとコマンドラインからテキストファイルを扱う手段がたくさんある。
特定文字列を含んだ行ならば grep が強力で、簡単に取得できる。
でも、ログみたいなテキストファイルから100行目や1000行目といった指定で特定行のみを抽出して表示するのって、今のところ grep では対応してなくて、割とコツが必要だったりする。
僕が知ってるいくつかの方法を備忘としてまとめてみた。
と言っても、2つだけしか知らないんだけど(2010.1.21 3つ目を追記)。

sed を使う方法

sed は、ストリームエディタの略。
ファイルを対象に、行単位で加筆/修正/削除するツール。

# i=1
# sed -n "${i}P" /etc/hosts

とコマンドを打てば、指定行(例では /etc/hosts の 1 行目)が表示される。
ループさせて、その1行の内容ごとに条件分岐させるとき、このやり方を使ってる。

head と tail を組み合わせる方法

head コマンドは、ファイルを上から n 行目まで表示させる。
tail コマンドは、ファイルを下から n 行目まで表示させる。


head コマンドで上から n 行目まで表示して、パイプで繋げて下から 1 行目を表示すれば、特定の行のみが表示される理屈。

# i=1
# head -${i} /etc/hosts | tail -1

サンプルとしては、こんな感じ?


懸念される点として、1行ずつ取り出すけど、全体でン万行とか展開する必要があるとき、どれくらいタイムロスが発生するかなんだよね。
10行とか100行とかは平気だろうけど、1000行目だと999行も無駄な読み込みが発生するんじゃないだろうか。
10000行だと、9999行とか…
100000行だと、99999行とか…


内部でどんな処理が走っているか知らないので、案外問題にならないかもしれない。
でも、感覚的にはピンポイントで指定できる sed での指定を使っている。


実際にテストしてみればいい話なんだけどね。
テスト方法を考える気力がない(^_^;


〜2010.1.21 追記〜
awk でも特定行を取り出す命令文を書けるみたい。
http://myplayground.blog.so-net.ne.jp/2009-11-03-1

$ awk '1 <= NR && NR <= 3' ファイル名

1行目から3行目のみ取り出す


ちなみに未確認…