Linux/Unix の Pipe、Grep、Sort コマンドと例

⚡ スマートサマリー

LinuxおよびUnixのパイプ、grep、およびsortコマンドは、テキストを連結およびフィルタリングします。パイプは、あるコマンドの出力を次のコマンドに渡し、grepはパターンを検索し、sortは行を並べ替え、フィルタはそれらの間のデータを変換します。

  • 🔗 パイプ: パイプ記号 | は、あるコマンドの出力を次のコマンドの入力として渡します。
  • 📄 ページング: catコマンドをless、pg、またはmoreにパイプすると、長いファイルが一度に1画面ずつ表示されます。
  • 🔍 grep: grepコマンドは、ファイル内から文字列またはパターンに一致する行を検索します。
  • 🎚️ grepオプション: -v、-c、-n、-i、-l などのフラグは、ファイルの反転、カウント、番号付け、大文字小文字の区別の無視、および一覧表示を行います。
  • 🔤 選別: sortコマンドはファイルの行を並べ替えます。-r、-n、-fオプションはそれぞれ逆順、数値順、大文字小文字を区別しない順を表します。
  • 🧪 フィルタ: grep、sort、awk、sed、wcなどのフィルタコマンドは、パイプで渡された入力を処理し、出力を生成します。
  • 🤖 AIによる支援: AIアシスタントとGitHub Copilotは、パイプ、grep、ソートのパイプラインを構築し、説明することができます。

LinuxおよびUnixにおけるパイプ、grep、およびソートコマンドの例

パイプ、grep、およびソートは、 Linux コマンドラインは、小さなコマンドを組み合わせて強力なワークフローを構築できるため、非常に便利です。このページでは、それぞれのコマンドを具体的な例を交えて解説し、フィルターがどのようにそれらを連携させるかを示します。

Linux のパイプとは何ですか?

パイプはLinuxのコマンドの一つで、2つ以上のコマンドを連携させ、一方のコマンドの出力を他方のコマンドの入力として使用できます。つまり、各プロセスの出力がパイプラインのように次のプロセスに直接入力される仕組みです。記号「|」はパイプを表します。

パイプを使うと、2つ以上のコマンドを同時に組み合わせて連続して実行できます。複雑なタスクを瞬時に実行する強力なコマンドを利用できます。

例でこれを理解しましょう。

複数ページにまたがるファイルを表示するために「cat」コマンドを使用すると、プロンプトがすぐにファイルの最後のページに移動してしまい、途中の内容が表示されません。

これを回避するには、「cat」コマンドの出力を「less」コマンドにパイプで渡すと、一度にスクロールできるコンテンツの長さ分だけが表示されます。

cat filename | less

図解があれば分かりやすいでしょう。下の図は、パイプがどのようにしてあるコマンドの出力を次のコマンドに渡すかを示しています。

あるコマンドの出力を次のコマンドの入力として渡すLinuxパイプの図

「pg」コマンドと「more」コマンド

「less」の代わりに、pgコマンドまたはmoreコマンドを使用することもできます。

cat Filename | pg

or

cat Filename | more

すると、ファイルを読みやすいように分割して表示でき、Enterキーを押すだけでスクロールダウンできます。下のスクリーンショットは、moreコマンドでページングされたファイルを示しています。

catコマンドをmoreコマンドにパイプして、長いファイルを1画面ずつページングする

「grep」コマンド

例えば、テキストファイルの中から郵便番号などの特定の情報を検索したいとします。

自分で手動で内容をざっと見て trac情報を使用します。より良い選択肢は、 grep このコマンドは、文書から必要な情報をスキャンし、指定した形式で結果を表示します。

構文:

grep search_string

実際に動作を見てみましょう。下のスクリーンショットは検索結果を示しています。

サンプルファイルから文字列「Apple」と「Eat」を検索するgrepコマンド

ここでは、grepコマンドがファイル「sample」から「Apple」と「Eat」という文字列を検索しています。このコマンドには以下のオプションを使用できます。

オプション 演算
-v 検索文字列に一致しない行をすべて表示します
-c 一致した行の数のみを表示します
-n 一致する行とその番号を表示します
-i 大文字と小文字の両方に一致します
-l ファイル名だけを文字列で表示します

上記で使用したファイルと同じファイルで、「-i」オプションを試してみましょう。下のスクリーンショットは、大文字小文字を区別しない結果を示しています。

grep -i は、大文字小文字を区別せずに文字 a を検索します。

'-i' オプションを使用すると、grep はすべての行から文字列 'a' (大文字小文字を区別しない) をフィルタリングします。

「並べ替え」コマンド

このコマンドは、ファイルの内容をアルファベット順に並べ替えるのに役立ちます。

このコマンドの構文は次のとおりです。

sort Filename

以下にcatで示すファイルの内容を考えてみましょう。

cat コマンドでファイル abc の未整理の内容を表示

sortコマンドを実行すると、以下に示すように、それらの行がアルファベット順に並べ替えられます。

sortコマンドは、ファイルabcの内容をアルファベット順に並べ替えます。

このコマンドには拡張機能もあり、それらは以下にリストされています。

オプション 演算
-r Reversesソート
-n 数値順に並べ替えます
-f 大文字小文字を区別しないソート

以下の例は、ファイル「abc」の内容を逆順に並べ替えることを示しています。

sort -r コマンドは、ファイル abc の内容を逆順に並べ替えます。

フィルタとは何ですか?

Linuxには、awk、grep、sed、spell、wcなど、多くのフィルタコマンドがあります。フィルタは、あるコマンドから入力を受け取り、何らかの処理を行い、出力を生成します。

2つのコマンドをパイプで接続すると、最初のコマンドの「フィルタリングされた」出力が次のコマンドに渡されます。下の図は、フィルタがパイプラインにどのように組み込まれるかを示しています。

パイプ入力を受け取り、処理し、出力を生成するLinuxフィルタの図

例を使ってこれを理解しましょう。以下に示すcatで表示される「sample」というファイルがあります。

catコマンドは、フィルタリング前のサンプルファイルの内容を表示します。

文字「a」を含まない行のみを強調表示したいが、結果は逆順で表示したい。そのためには、以下の構文を使用できます。

cat sample | grep -v a | sort -r

結果を見てみましょう。下のスクリーンショットに示されています。

catコマンドをgrep -vとsort -rにパイプして、文字aを含まない逆順の行を生成する

よくあるご質問

パイプ記号(|)は、あるコマンドの出力を別のコマンドに直接渡して、コマンドを連結します。リダイレクト記号(>と<)は、コマンドをファイルに接続し、出力をファイルに書き込んだり、入力をファイルから読み込んだりします。パイプ記号はコマンド同士を連結し、リダイレクト記号はコマンドとファイルを連結します。

grepはGlobal Regular Expression Printの略です。ファイルや入力内容を1行ずつスキャンし、指定したパターンに一致する行をすべて出力します。この名前は、同じ検索を実行していた古いedエディタのコマンドg/re/pに由来しています。

sortコマンドには、ソートと重複行の削除を一度に行う-uオプションがあります。例:sort -u file。また、sortコマンドをuniqコマンドにパイプで渡すこともできます。例:sort file | uniq。uniqコマンドは既に隣接している重複行のみを削除するためです。

リダイレクトを使用してパイプラインを終了します。`cat sample | grep -va | sort -r > result.txt` は最終出力をファイルに書き込みます。出力を画面に表示し、同時に保存するには、代わりに `tee` コマンドにパイプしてください。

grepコマンドは、ファイル内でテキストパターンに一致する行を検索します。一方、findコマンドは、名前、サイズ、種類、日付などに基づいてファイルやディレクトリ自体を検索します。つまり、grepはファイルの内容を調べるのに対し、findはディレクトリツリー全体からファイルを検索します。

teeコマンドはパイプからデータを読み込み、画面と1つ以上のファイルに同時に書き込みます。例えば、`grep error log | tee errors.txt`のように使用します。これにより、パイプラインを中断することなく中間出力を保存できます。

AIアシスタントは、平易な英語のリクエストから適切なパイプラインコマンドの連鎖を提案したり、馴染みのないgrepやsortフラグを説明したり、パイプライン内のエラーを検出したりできます。また、機械学習ツールはパイプラインログ出力をスキャンして、手動フィルタリングでは見逃してしまうような異常を検出します。

Yes. GitHubコパイロット 必要な内容を記述した短いコメントから、cat、grep、sortを組み合わせたパイプラインを生成し、入力と同時にコマンドを補完できます。 Rev提案されたパイプラインは、サンプルデータに対して、特に行の並べ替えや削除を行うオプションについては、必ず確認してください。