コマンドの実行制御とパイプライン

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

はじめに

Linux のコマンド実行とテキスト処理に関する実践的な実験へようこそ!Linux が初めての方でも心配いりません。各ステップを丁寧にご案内します。この実験では、複数のコマンドを効率的に実行する方法や、強力なテキスト処理ツールの使い方を学びます。この実験を終える頃には、プロのようにコマンドを組み合わせ、テキストを検索し、データを自在に操作できるようになっているはずです。

コマンドの逐次実行

Linux では、1 行の中で複数のコマンドを順番に実行することができます。これは、一連の関連するタスクをまとめて行いたい場合に非常に便利です。

まずは簡単な例から始めましょう。現在のシステム日付を表示した後、ホームディレクトリの内容をリスト表示してみます。

date && ls ~

このコマンドの仕組みは以下の通りです:

  • date: 現在の日付と時刻を表示します。
  • &&: 「かつ(and)」を意味する記号です。最初のコマンドが成功した場合にのみ、次のコマンドを実行するよう Linux に指示します。
  • ls ~: ホームディレクトリの内容をリスト表示します(~ 記号はホームディレクトリを表します)。

ターミナルにこのコマンドを入力して Enter キーを押してください。今日の日付に続いて、ホームディレクトリ内のファイルやフォルダの一覧が表示されるはずです。

日付の後にファイルが表示されなくても心配しないでください。それはホームディレクトリが空であることを意味しているかもしれません。その場合は、代わりに出力が確実に確認できる ls /home/labex を試してみてください。

条件付きコマンド実行

このステップでは、前のコマンドの成功または失敗に基づいて実行を制御する「条件演算子」の使い方を学びます。

まず、インストールされていないプログラムを使って条件付きコマンドを試してみましょう。

which cowsay && cowsay "Hello, LabEx" || echo "cowsay is not installed"

このコマンドシーケンスの説明:

  • which cowsay: cowsay プログラムがインストールされているか確認します。
  • &&: 論理積(AND)演算子です。前のコマンドが成功した場合のみ、次のコマンドを実行します。
  • cowsay "Hello, LabEx": 牛のアスキーアートが "Hello, LabEx" と喋る様子を表示します。
  • ||: 論理和(OR)演算子です。前のコマンドが失敗した場合のみ、次のコマンドを実行します。
  • echo "cowsay is not installed": cowsay がインストールされていないことを示すメッセージを表示します。

現時点ではシステムに cowsay がインストールされていないため、"cowsay is not installed" という出力が表示されるはずです。

次に、cowsay をインストールしてみましょう。

sudo apt-get update && sudo apt-get install -y cowsay

インストールが終わったら、先ほどと同じコマンドをもう一度実行します。

which cowsay && cowsay "Hello, LabEx" || echo "cowsay is not installed"

今度は、牛のアスキーアートが "Hello, LabEx" と言っているのが見えるはずです。

この例は、&&|| を使って条件付きのコマンドの流れを作る方法を示しています。&& は「前のコマンドが成功したら実行」、|| は「前のコマンドが失敗したら実行」を意味します。

何が起きたのか整理しましょう:

  1. インストール前:

    • which cowsay が実行されました(一致するものは見つかりませんでした)。
    • && により cowsay "Hello, LabEx" が試みられましたが、インストールされていないため失敗しました。
    • cowsay が失敗したため、|| の後のコマンド(echo "cowsay is not installed")が実行されました。
  2. インストール後:

    • which cowsay が成功したため、cowsay "Hello, LabEx" が実行されました。
    • || の後の echo コマンドを実行する必要はありませんでした。

これらの演算子を使って、自分なりの条件付きコマンドを作ってみてください!

パイプライン入門

パイプライン(Pipelines)は Linux の強力な機能で、あるコマンドの出力を別のコマンドの入力として繋ぐことができます。これは |(パイプ)記号を使って行います。

簡単な例から始めましょう。

ls -l /etc | less

このコマンドの動作:

  • ls -l /etc: /etc ディレクトリの内容を詳細形式でリスト表示します。
  • |: 前のコマンドの出力を次のコマンドへ送ります。
  • less: テキストをスクロールして閲覧できるようにするプログラムです。

これを実行すると、ファイルとディレクトリの一覧が表示されます。上下の矢印キーでスクロールでき、'q' キーを押すと終了します。

次に、もう少し複雑なパイプラインを試してみましょう。

ls -l /etc | grep '^d' | wc -l

このコマンドは /etc 内にあるディレクトリの数を数えます。仕組みは以下の通りです:

  1. ls -l /etc: /etc の内容を詳細形式で表示します。
  2. grep '^d': 'd' で始まる行(ディレクトリを示す行)だけを抽出します。
  3. wc -l: 行数を数えます(これがディレクトリの数になります)。

画面に数字が表示されるはずです。それが /etc 内のディレクトリ数です。

cut を使ったフィールドの抽出

cut コマンドは、ファイルの各行から特定の部分を抽出するのに便利です。ここでは、システム上のユーザーアカウント情報が含まれている /etc/passwd ファイルから、ユーザー名とホームディレクトリを抽出してみます。

次のコマンドを実行してください:

cut -d: -f1,6 /etc/passwd | head -n 5

内容を分解してみましょう:

  • cut: 行の一部を抽出するコマンドです。
  • -d:: 区切り文字(デリミタ)として : を使用します。
  • -f1,6: 1 番目と 6 番目のフィールド(ユーザー名とホームディレクトリ)を抽出します。
  • |: 出力を次のコマンドに渡します。
  • head -n 5: 出力の最初の 5 行だけを表示します。

以下のような出力が表示されるはずです:

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin

各行に、コロンで区切られたユーザー名とホームディレクトリが表示されています。

grep とパイプライン、コマンドシーケンスの組み合わせ

このステップでは、より高度なテキスト処理のために、grep をパイプラインやコマンドシーケンスと組み合わせて使う方法を学びます。

まず、.zshrc ファイルの中から "PATH" という文字列を含むすべての行を検索し、その数を数えてみましょう。

grep "PATH" ~/.zshrc | wc -l

このパイプラインは、まず grep で "PATH" を含む行を見つけ、その結果を wc -l に渡して行数をカウントします。

次に、コマンドシーケンスを使って、"PATH" が見つかった場合にのみ "HOME" を検索するようにしてみます。

grep "PATH" ~/.zshrc && grep "HOME" ~/.zshrc

これにより、"PATH" を含む行が存在する場合にのみ、"HOME" を含む行が表示されます。

さらに複雑な例を試してみましょう。/etc/passwd の中から "bin" で終わる行を検索し、それらを並べ替えて、最初の 5 行を表示します。

grep "bin" /etc/passwd | sort | head -n 5

このパイプラインは 3 つのことを行っています:

  1. "bin" を含む行を探します。
  2. それらの行をアルファベット順に並べ替えます(ソート)。
  3. 結果の最初の 5 行だけを表示します。

最後に、これまでに学んだことをすべて組み合わせてみましょう。/etc/passwd 内で "sh" を含む行を検索してカウントし、その数に基づいて、行を表示するかメッセージを表示するかを判断します。

grep "sh" /etc/passwd | wc -l | {
  read count
  [ $count -gt 5 ] && grep "sh" /etc/passwd || echo "Found $count lines, not enough to display."
}

この複雑なコマンドは以下の処理を行います:

  1. "sh" を含む行を検索します。
  2. それらの行数を数えます。
  3. カウントが 5 より大きい場合(-gt 5)、該当する行を表示します。
  4. カウントが 5 以下の場合は、カウント数を含むメッセージを表示します。

注意:ターミナルで複数行にわたるコマンドを入力する場合、行を区切るために各行(最後を除く)の後に Alt+Enter を押す必要がある場合があります。あるいは、単にコマンド全体を 1 行で入力しても構いません。

これらのコマンドを実行し、自分なりの組み合わせを試してみてください!

wc によるカウント

wc(word count)コマンドは、テキスト内の行数、単語数、文字数を数えるのに便利です。

まず、/etc/passwd の行数を数えてみましょう。

wc -l /etc/passwd

-l オプションは wc に行数を数えるよう指示します。数字の後にファイル名が表示されるはずです。

次に、/etc/passwd の最初の 10 行に含まれる単語数を数えてみます。

head -n 10 /etc/passwd | wc -w

このパイプラインは 2 つのことを行います:

  1. head -n 10 /etc/passwd: ファイルの最初の 10 行を取得します。
  2. wc -w: それらの行の単語数を数えます。

単語数を示す数字が表示されるはずです。

sort による並べ替え

sort コマンドは、テキストの行を並べ替えるために使用されます。/etc/passwd ファイルを 3 番目のフィールド(ユーザーID)で並べ替えてみましょう。

sort -t: -k3 -n /etc/passwd | head -n 5

各パーツの役割は以下の通りです:

  • -t:: フィールドの区切り文字として : を使用します。
  • -k3: 3 番目のフィールドに基づいて並べ替えます。
  • -n: (アルファベット順ではなく)数値として並べ替えます。
  • | head -n 5: 出力の最初の 5 行だけを表示します。

ユーザーID(3 番目のフィールド)でソートされた /etc/passwd の最初の 5 行が表示されるはずです。

uniq による重複の削除

uniq コマンドは、ソートされたテキストから重複した行を削除したり、特定したりするために使用されます。/etc/passwd からユニーク(一意)なシェル(利用されているシェルの種類)を見つけてみましょう。

cut -d: -f7 /etc/passwd | sort | uniq

このパイプラインは 3 つのことを行っています:

  1. cut -d: -f7 /etc/passwd: 各行から 7 番目のフィールド(シェル)を抽出します。
  2. sort: 行をアルファベット順に並べ替えます。
  3. uniq: 重複する行を削除します。

システムで使用されているユニークなシェルのパス一覧が表示されるはずです。

次に、各シェルを何人のユーザーが使用しているか数えてみましょう。

cut -d: -f7 /etc/passwd | sort | uniq -c

-c オプションを付けると、各行の先頭に出現回数が表示されます。各シェルのパスの前に、そのシェルを使用しているユーザー数を示す数字が表示されるはずです。

まとめ

お疲れ様でした!Linux のコマンド実行とテキスト処理に関する実験を完了しました。学んだことを振り返ってみましょう:

  1. && を使ってコマンドを順番に実行し、|| を使って条件付きで実行することができます。
  2. パイプライン(|)を使うと、複数のコマンドを繋ぎ、一方の出力を次への入力として渡すことができます。
  3. cut は、ファイル内の行の特定の部分を抽出するのに最適です。
  4. grep は、テキスト内の特定のパターンを検索するのに役立ちます。
  5. wc は、テキストの行数、単語数、文字数をカウントできます。
  6. sort は、テキストの行を特定の順序で整列させます。
  7. uniq は、ソートされたテキストから重複を削除し、出現回数を数えることができます。

これらのツールは、Linux におけるテキスト処理の基本です。Linux の学習を続ける中で、これらのコマンドを組み合わせて複雑なテキスト処理タスクを解決する方法が数多く見つかるでしょう。恐れずに、新しい組み合わせをどんどん試してみてください!

習うより慣れろです。理解を深めるために、異なるファイルやオプションを使ってこれらのコマンドを試してみてください。コマンドの使いかたを忘れてしまったときは、いつでも man コマンド(例:man grep)を使ってマニュアルページを確認できます。

これからも探索を続け、Linux の学習を楽しんでください!