Linux データパイプ処理

LinuxBeginner
オンラインで実践に進む

はじめに

Linux のデータパイピングは、あるコマンドの出力を別のコマンドへの入力として渡すことができる強力なテクニックです。この基本的な概念により、複雑なコマンドチェーンを作成して、データを効率的に処理および変換できます。この実験(Lab)では、パイプ演算子(|)を使用して複数のコマンドを組み合わせ、データ処理のワークフローを作成する方法を学びます。また、コマンドパイプラインで頻繁に使用される、grepsorttruniq などの重要なテキスト処理ユーティリティについても学習します。

この実験(Lab)を終えるまでに、Linux コマンドラインツールとパイプラインの概念を使用して、データをフィルタリング、変換、および整理する方法を理解できるようになります。これらのスキルは、Linux 環境でのテキスト処理、ログ分析、およびデータ操作タスクに不可欠です。

テキストフィルタリングのための grep コマンドの理解

grep コマンドは、Linux における強力なテキストフィルタリングツールであり、ファイルまたは入力ストリーム内のパターンを検索します。このステップでは、grep を使用してファイル内の特定のテキストパターンを見つける方法を学びます。

grep を使用して data.txt ファイルをフィルタリングし、文字列 "apple" を含む行を見つけましょう。

cd ~/project
grep "apple" data.txt

このコマンドを実行すると、次の出力が表示されるはずです。

apple
pineapple

grep コマンドは、文字列 "apple" を含む 2 つの行を見つけました。"apple" だけの行と "pineapple" の行です。

次に、grep を使用して、systems.txt ファイル内の単語 "system" を含むすべての行を見つけましょう。

grep "system" systems.txt

出力は次のようになります。

file system
system update
system security

grep コマンドは、デフォルトでは大文字と小文字を区別します。大文字と小文字を区別しない検索を実行する場合は、-i オプションを使用できます。

grep -i "SYSTEM" systems.txt

これにより、ファイルには小文字の "system" が含まれているにもかかわらず、大文字の "SYSTEM" を検索した場合でも、以前と同じ出力が生成されます。

grep を使用してテキストをフィルタリングする方法を理解できたので、次のステップに進み、パイプを使用してコマンドを組み合わせる方法を学びます。

パイプ演算子を使用したコマンドの連結

このステップでは、パイプ演算子(|)を使用して複数のコマンドを連結する方法を学びます。パイプは、あるコマンドの出力を別のコマンドへの入力として渡し、強力なコマンドチェーンを作成できるようにします。

パイプ演算子は、縦棒文字(|)で表されます。簡単な例でその仕組みを見てみましょう。

cd ~/project
ls -l | grep "txt"

この例では、ls -l コマンドは現在のディレクトリ内のファイルを一覧表示し、その出力は grep "txt" コマンドにパイプされます。grep "txt" コマンドは、"txt" を含む行のみをフィルタリングして表示します。結果として、現在のディレクトリにあるテキストファイルの一覧が表示されます。

パイプ演算子を使用して、grep を他のコマンドと組み合わせてみましょう。まず、foods.txt ファイル内の "apple" を含むすべての行を見つけます。

cat foods.txt | grep "apple"

出力は次のようになります。

apple juice
apple pie

cat コマンドはファイルを読み取り、その内容をパイプを介して grep に送信します。次に、grep コマンドは内容をフィルタリングし、"apple" を含む行のみを表示します。

次に、より多くのコマンドを組み合わせてデータを変換してみましょう。tr コマンドは、文字を変換または削除するために使用されます。これを使用して、小文字を大文字に変換できます。

cat foods.txt | grep "apple" | tr '[:lower:]' '[:upper:]'

出力は次のようになります。

APPLE JUICE
APPLE PIE

このコマンドパイプラインでは:

  1. cat foods.txt は foods.txt ファイルの内容を読み取ります
  2. パイプ(|)はこの内容を grep "apple" に送信します
  3. grep "apple" はフィルタリングし、"apple" を含む行のみを保持します
  4. パイプ(|)はこれらのフィルタリングされた行を tr '[:lower:]' '[:upper:]' に送信します
  5. tr '[:lower:]' '[:upper:]' はすべての小文字を大文字に変換します

これは、パイプを使用して複数のコマンドを連結し、データ処理ワークフローを作成する方法を示しています。チェーン内の各コマンドは、データに対して特定の操作を実行し、最終的な結果はこれらのすべての操作の組み合わせです。

numbers.txt ファイルでもう 1 つ例を試してみましょう。これらの数値を昇順にソートします。

cat numbers.txt | sort -n

出力は次のようになります。

1
3
5
7
8
9
10

-n オプションを指定した sort コマンドは、数値を数値的にソートします。パイプを使用しない場合、ソートされた出力を新しいファイルに書き込んでからそのファイルを表示する必要がありますが、パイプを使用すると、結果をすぐに確認できます。

高度なパイプライン:sort、uniq、およびその他のコマンドの組み合わせ

このステップでは、sortuniqwc などの複数のコマンドを組み合わせて、データを処理および分析するための、より複雑なパイプラインを作成する方法を学びます。

sort コマンドは、テキストファイルまたは入力ストリームの行をソートするために使用されます。uniq コマンドは、ファイルまたは入力ストリーム内の重複する行をフィルタリングしますが、ソートされた入力に対してのみ正しく機能します。これらのコマンドをパイプと組み合わせることで、データを効率的に処理および整理できます。

fruits_with_duplicates.txt ファイルから、アルファベット順にソートされた一意の果物名を表示するには、次のように使用できます。

cd ~/project
cat fruits_with_duplicates.txt | sort | uniq

出力は次のようになります。

apple
banana
kiwi
orange

このパイプラインでは:

  1. cat fruits_with_duplicates.txt はファイルの内容を読み取ります
  2. sort は行をアルファベット順に並べ替えます
  3. uniq は重複する行を削除します

リストに各果物が表示される回数をカウントする場合は、uniq-c オプションを使用できます。

cat fruits_with_duplicates.txt | sort | uniq -c

出力には、各果物のカウントが表示されます。

      3 apple
      2 banana
      1 kiwi
      1 orange

logs.txt ファイルで発生したエラーの数を確認するには、次のように使用できます。

cat logs.txt | grep "ERROR" | wc -l

出力は次のようになります。

3

このパイプラインでは:

  1. cat logs.txt はログファイルを読み取ります
  2. grep "ERROR" はエラーメッセージのみをフィルタリングします
  3. wc -l は行数(つまり、エラーメッセージの数)をカウントします

employees.txt ファイルを使用して、より複雑なパイプラインを作成しましょう。部署を見つけ、各部署に何人の従業員がいるかをカウントするには:

cat employees.txt | cut -d',' -f2 | sort | uniq -c

出力は次のようになります。

      2 HR
      2 IT
      2 Sales

このパイプラインでは:

  1. cat employees.txt は従業員データを読み取ります
  2. cut -d',' -f2 は、コンマを区切り文字として使用して、2 番目のフィールド(部署)を抽出します
  3. sort は部署をアルファベット順にソートします
  4. uniq -c は各部署の出現回数をカウントします

これらの例は、パイプを使用して複数のコマンドを組み合わせて、強力なデータ処理ワークフローを作成する方法を示しています。Linux パイプラインの概念を使用すると、複雑なデータ処理タスクをより簡単なステップに分割し、コマンドライン操作をより効率的かつ柔軟にすることができます。

Linux パイプラインの実践的な応用

この最後のステップでは、ログファイルの分析、データファイルの処理、および一般的なシステム管理タスクの解決を通じて、Linux パイプラインの実際のアプリケーションをいくつか探ります。

ログファイルの分析

システム管理者は、ログファイルから有用な情報を抽出する必要があることがよくあります。パイプラインを使用して、server_log.txt ファイルを分析してみましょう。

  1. 各ログレベル(INFO、WARNING、ERROR)の出現回数をカウントします。
cd ~/project
cat server_log.txt | grep -o "INFO\|WARNING\|ERROR" | sort | uniq -c

出力:

      4 INFO
      3 ERROR
      2 WARNING
  1. すべてのタイムスタンプとログレベルを抽出します。
cat server_log.txt | grep -o "\[[0-9-]* [0-9:]*\] [A-Z]*" | head -5

出力:

[2023-05-10 08:45:22] INFO
[2023-05-10 09:12:35] ERROR
[2023-05-10 09:14:01] INFO
[2023-05-10 09:14:10] INFO
[2023-05-10 09:30:45] WARNING

CSV データの処理

パイプラインを使用して、sales.csv ファイルを分析してみましょう。

  1. 販売された一意の製品を抽出してカウントします。
cat sales.csv | tail -n +2 | cut -d',' -f2 | sort | uniq -c

tail -n +2 コマンドは、CSV ファイルのヘッダー行をスキップします。

出力:

      2 Keyboard
      2 Laptop
      2 Monitor
      2 Mouse
      1 Printer
  1. 販売されたユニットの総数を計算します。
cat sales.csv | tail -n +2 | cut -d',' -f3 | paste -sd+ | bc

出力:

113

このパイプラインは、3 番目の列(Units)を抽出し、すべての値を "+" 記号で結合し、bc 電卓を使用して合計を計算します。

システム監視タスク

Linux パイプラインは、システム監視および管理タスクにも役立ちます。

  1. 最も多くのメモリを消費している上位 5 つのプロセスを一覧表示します。
ps aux | sort -k 4 -r | head -6

このコマンドは、4 番目の列(メモリ使用量)で降順にソートされたプロセスを一覧表示し、上位 6 行(ヘッダーを含む)を表示します。

  1. 10MB より大きいすべてのファイルを見つけ、サイズでソートします。
cd ..
find . -type f -size +10M -exec ls -lh {} \; | sort -k 5 -h

このコマンドは、サイズでソートされた大きなテストファイルを表示します。出力は次のようになります。

-rw-r--r-- 1 labex labex 12M May 10 12:00 ./large_file3.dat
-rw-r--r-- 1 labex labex 15M May 10 12:00 ./large_file2.dat
-rw-r--r-- 1 labex labex 20M May 10 12:00 ./large_file1.dat

この例は、ファイルを見つけてサイズでソートする方法を示しています。これらのファイルは、Linux でのファイルサイズフィルタリングの仕組みを示すために、セットアップ中に特別に作成されました。

これらの例は、Linux パイプラインを実際の問題を効率的に解決するためにどのように使用できるかを示しています。単純なコマンドを組み合わせることで、複雑なスクリプトやプログラムを作成せずに、強力なデータ処理ワークフローを作成できます。

まとめ

この実験(Lab)では、コマンドの連結とデータ処理のための強力なテクニックである Linux のデータパイプ処理について学びました。この実験で取り上げた主な概念は次のとおりです。

  1. grep による基本的なテキストフィルタリング: grep コマンドを使用して、テキストファイル内の特定のパターンを検索し、それらのパターンに基づいてデータをフィルタリングする方法を学びました。

  2. パイプによるコマンドの連結: パイプ演算子(|)を使用して複数のコマンドを接続し、あるコマンドの出力を別のコマンドへの入力として渡す方法を検討しました。

  3. テキスト処理コマンド: 次のようなさまざまなテキスト処理ユーティリティを使用しました。

    • テキストのフィルタリングのための grep
    • 文字変換のための tr
    • 行の並べ替えのための sort
    • 重複の削除のための uniq
    • 構造化データからの特定のフィールドの抽出のための cut
    • 行、単語、または文字のカウントのための wc
  4. 実際のアプリケーション: これらのパイプラインテクニックを、ログ分析、CSV データ処理、システム監視タスクなどの実際的な問題を解決するために適用しました。

これらの Linux パイプラインスキルは、Linux 環境で作業するシステム管理者、データアナリスト、および開発者にとって不可欠です。これらにより、本格的なプログラムを作成せずに、コマンドラインから直接複雑なデータ操作タスクを実行できます。パイプを介して単純なコマンドを組み合わせることで、効率的かつ柔軟な強力なデータ処理ワークフローを作成できます。

Linux の旅を続けるにつれて、コマンドパイプラインの技術を習得することで、コマンドライン環境での生産性と問題解決能力が大幅に向上することがわかるでしょう。