一万行のログ
あるコンビニチェーンの本部で、システム担当として働いています。店長から電話がありました。「今朝のレジの記録を見てほしい」とのことです。
ログファイルは一万行あります。上から全部読むと、一日かかります。
ターミナルなら、必要な行だけを数秒で取り出せます。
このレッスンのゴール
メモ
ターミナルで、テキストファイルを読んで検索できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| テキストファイル | 文字だけが入ったファイル | sales.log |
| ログ | 起きたことを順に書いた記録 | |
| 行 | ファイルの中の一行分の文字 | |
| 検索 | 決まった文字を含む行を探すこと | |
| パイプ | 前のコマンドの結果を次に渡す記号 | | |
学生が入力するセルは、このプレビューでは空白です。
cat と head で中身を見る
cat ファイル名 は、ファイルの中身を全部表示します。短いファイルならこれで十分です。
head -n 3 ファイル名 は、最初の3行だけを表示します。長いファイルの形を知りたいときに便利です。
wc -l ファイル名 は、行の数を数えます。ログの大きさがすぐにわかります。
売上ログを読む
printf '09:01 渋谷店 おにぎり 3個\n09:02 新宿店 コーヒー 1杯\n09:05 渋谷店 弁当 2個\n09:07 池袋店 コーヒー 2杯\n09:10 新宿店 おにぎり 1個\n09:12 渋谷店 コーヒー 1杯\n' > sales.log
# ファイル全体を表示します。
cat sales.log
# 最初の3行だけを表示します。
head -n 3 sales.log
# 行数を数えます。
wc -l sales.log
grep は一致する行を取り出す
grep 渋谷店 sales.log は、「渋谷店」という文字を含む行だけを表示します。
ほかの行は表示されません。ファイルそのものは何も変わりません。
-c を付けると、行を表示する代わりに、一致した行の数を表示します。
店名で探す
printf '09:01 渋谷店 おにぎり 3個\n09:02 新宿店 コーヒー 1杯\n09:05 渋谷店 弁当 2個\n09:07 池袋店 コーヒー 2杯\n09:10 新宿店 おにぎり 1個\n09:12 渋谷店 コーヒー 1杯\n' > sales.log
# 「渋谷店」を含む行だけを表示します。
grep 渋谷店 sales.log
# -c を付けると、一致した行の数だけを表示します。
grep -c 渋谷店 sales.log
# やってみましょう: コーヒーを含む行を表示してください。
よくある誤解
注意
grep は探した言葉だけを表示する、と思われがちです。実際は、その言葉を含む行を丸ごと表示します。だから時刻や数量も一緒に見えます。行の中の位置を知りたいときは、表示された行を読みます。
パイプでコマンドをつなぐ
| はパイプです。左のコマンドの結果を、右のコマンドに渡します。
grep 新宿店 sales.log | wc -l は、新宿店の行を取り出してから、その行数を数えます。
小さなコマンドを順につなぐと、大きな作業ができます。
例: パイプで何が起きるか
| コマンド | 一つ目の結果 | 最後の結果 |
|---|---|---|
| grep 新宿店 sales.log | wc -l | 新宿店の行が2行 | 2 |
| grep コーヒー sales.log | wc -l | コーヒーの行が3行 | 3 |
| grep 渋谷店 sales.log | grep コーヒー | 渋谷店の行が3行 | 09:12 渋谷店 コーヒー 1杯 |
| head -n 2 sales.log | grep 渋谷店 | 最初の2行 | 09:01 渋谷店 おにぎり 3個 |
学生が入力するセルは、このプレビューでは空白です。
パイプで数える
printf '09:01 渋谷店 おにぎり 3個\n09:02 新宿店 コーヒー 1杯\n09:05 渋谷店 弁当 2個\n09:07 池袋店 コーヒー 2杯\n09:10 新宿店 おにぎり 1個\n09:12 渋谷店 コーヒー 1杯\n' > sales.log
# grep の結果を wc に渡して、行数を数えます。
grep 新宿店 sales.log | wc -l
# grep を二回つなぐと、両方を含む行が残ります。
grep 渋谷店 sales.log | grep コーヒー
# やってみましょう: おにぎりの行が何行あるか、
# パイプと wc -l で数えてください。