【 | / >】実践!パイプとリダイレクトでデータを加工する【続・Linuxコマンド入門 #3】

linuxコマンドを連結しより高度に扱うためのパイプやリダイレクトの仕方について紹介するシリーズのサムネイル 5 記事
シリーズ

続・Linuxコマンド入門 ~パイプとリダイレクトを使いこなす~

Linuxコマンドの出力に対して処理してデータを加工したり、処理を自動化する「コマンド結合」の方法について紹介します。

前回は、コマンドとコマンドを |(パイプ) で繋ぎ、あるコマンドの結果を次のコマンドの入力として渡す「ベルトコンベア」のような仕組みを学びました。

第1回(リダイレクト): > >> 2> を使い、結果(出力)を「バケツ(ファイル)」に溜める方法。

第2回(パイプ): | を使い、結果(出力)を「次の機械(コマンド)」に渡す方法。

linuxコマンド入門、コマンドの出力を次のコマンドに受け渡す "|" パイプの使い方について紹介。

【 | 】コマンドを繋げる「パイプ」~ | の使い方~【続・Linuxコマンド入門 #2】

コマンドを繋げる「パイプ (|)」入門!あるコマンドの結果を、ls | grep のように次のコマンドへ直接渡す仕組みを、初心者向けにわかりやすく解説します。

今回は、これらを組み合わせて使う実践編です。 さらに、第1回で学んだ「出力」の逆、「入力のリダイレクト」もここでマスターし、コマンドにデータを渡す方法を完璧にします。

pipe,rideirect,here textを自由に扱えるようになるための解説記事サムネイル

1. 今回のゴール:データ加工と保存

今回のゴールは、|(パイプ)でデータを流れ作業で加工し、>(リダイレクト)で最終結果をファイルに保存することです。


2. 新しい技術(入力のリダイレクト)

第1回では、コマンドの「出力」の行き先を変える >>> を学びました。 ここでは、コマンドの「入力」の元を変更する <<< を学びます。

2-1. < (入力リダイレクト)

> が「標準出力(蛇口の水)」をファイルに向けるのに対し、<ファイル(水源)をコマンドの「標準入力(機械の投入口)」に接続します

例えば、wc -l は通常、入力待ちになりますが、< を使うとファイルを行数カウントの「入力」として渡せます。

# sample_log.txt を wc -l の「入力」として渡す
wc -l < sample_log.txt
# 6

(これは cat sample_log.txt | wc -l と非常に似た動作をしますが、cat を省略できる分、より直接的です。)

2-1. << (ヒアドキュメント)

これが、今回サンプルファイルを作るために使う重要な機能です。 << は「Here Document(ここにあるドキュメント)」の略で、ファイルからではなく、今このターミナルから入力する複数行のテキストを、コマンドの「標準入力」として渡します。区切り文字を入力するまでコマンドに入力できます。

[コマンド] << [区切り文字] ([区切り文字] は EOF や END など、自分で決めた好きな単語でOKです)

3. データ処理で便利なコマンドの紹介

流れ作業を実装するとき便利なコマンドを2つ紹介します。

3-1. wc (word count)

wc -l: 行数 (Lines) を数える。

wc -l

3-2. sort 並べ替え

sort: 行単位で並び替える(ソートする)。

sort

4. 実践!パイプとリダイレクトでデータを加工する

それでは、実際にコマンドを繋げてみましょう。 まず、練習用のログファイル sample_log.txt を作ります。

ここで、先ほど学んだ <<(ヒアドキュメント)と、第1回で学んだ >(出力リダイレクト)を組み合わせます。

# cat コマンドの「入力」として、ターミナルからの複数行 (<< EOF) を渡す
# そして、cat コマンドの「出力」を、ファイル ( > sample_log.txt) に保存する

cat > sample_log.txt << EOF
[INFO] Application started.
[WARN] Network connection is slow.
[ERROR] Database connection failed.
[INFO] User 'admin' logged in.
[ERROR] File not found: /var/log/data.txt
[INFO] Shutting down...
EOF

解説:

  1. cat コマンドが起動します。
  2. << EOF により、「EOF という行が現れるまで」の入力を cat の標準入力に渡します。
  3. > sample_log.txt により、cat の標準出力(入力された内容がそのまま出てくる)が sample_log.txt に保存されます。

これで sample_log.txt ができました。


シナリオ1:ログファイルから「ERROR」の件数を数えてファイルに保存する

ゴール: sample_log.txt から “ERROR” を含む行だけを抜き出し、それが**何行あったか(件数)**を error_count.txt というファイルに保存する。

手順:

  1. cat でファイルを次に流す。
  2. | (パイプ) で grep に渡し、”ERROR” で絞り込む。
  3. | (パイプ) で wc -l に渡し、絞り込んだ結果の「行数」を数える。
  4. > (リダイレクト) で、最終的な「行数(数字)」を error_count.txt に保存する。

コマンド:

 cat sample_log.txt | grep "ERROR" | wc -l > error_count.txt

結果の確認:

cat error_count.txt
# 2

エラー件数の集計が自動化できました。


シナリオ2:「INFO」のログを並び替えて保存する

ゴール: sample_log.txt から “INFO” を含む行だけを抜き出し、それらをアルファベット順に並び替えて info_sorted.txt に保存する。

コマンド:

cat sample_log.txt | grep "INFO" | sort > info_sorted.txt

結果の確認:

cat info_sorted.txt
# [INFO] Application started.
# [INFO] Shutting down...
# [INFO] User 'admin' logged in.

Application, Shutting, User の順に並び替えられているのがわかりますね。


まとめ

今回は、|(パイプ)と >(リダイレクト)を組み合わせる実践編でした。 さらに、新たに入力リダイレクト <<<(ヒアドキュメント)も学びました。

cat [ファイル] | grep [条件] | wc -l > [結果ファイル]
  • | (パイプ) : コマンド(機械)を連結し、データを流れ作業で加工する。
  • > >> 2> (出力リダイレクト) : 結果(出力)をファイルに保存する。
  • < << (入力リダイレクト) : ファイルや複数行テキストをコマンド(機械)の入力にする。

次回は、データの「流れ」ではなく、コマンドの「実行順序」を制御する方法を学びます。 「もしコマンドAが成功したら、次にBを実行する」といった、より高度な自動化のための &&|| を紹介します。

linuxコマンドのAND OR制御 && や|| ;を自由に扱えるようになるための解説記事サムネイル

処理を自動化する「コマンド結合」~ && と || と ; の違い~【続・Linuxコマンド入門 #4】

Linuxコマンド && と || と ; の違い知ってる?「成功したら次」「失敗したら次」「必ず次」の実行順序を制御し、処理を自動化する方法を初心者向けに解説します。

linuxコマンドを連結しより高度に扱うためのパイプやリダイレクトの仕方について紹介するシリーズのサムネイル 5 記事
シリーズ

続・Linuxコマンド入門 ~パイプとリダイレクトを使いこなす~

Linuxコマンドの出力に対して処理してデータを加工したり、処理を自動化する「コマンド結合」の方法について紹介します。