\r\n\r\n

linuxでのパイプの使い方

linux pipeline orchestrationコマンドラインユーティリティを使った共同作業の方法。独立したコマンドのセットを活用し、集中したチームに変換することで、複雑なプロセスを簡素化し、生産性を向上させることができます。その方法を紹介します...

Linux Pipeline Orchestrationコマンドラインユーティリティを使用したコラボレーション方法。独立したコマンドのセットを活用し、集中したチームに変換することで、複雑なプロセスを簡素化し、生産性を向上させることができます。その方法を紹介します。

いたるところにパイプがある

パイプは、Linux や Unix 系 OS の最も便利なコマンドライン機能の 1 つです。パイプの使い道は無数にあります。私たちのサイトに限らず、あらゆるウェブサイトのLinuxコマンドラインの記事を見てみると、パイプが頻繁に登場することがわかると思います。How To GeekのLinuxの記事をいくつか見直してみましたが、どれも何らかの形でパイプを使っていますね。

Linux plumbingでは、シェルではサポートされていないアウトオブボックスな操作を行うことができます。しかし、Linuxは多くの小さなユーティリティがそれぞれの専門的な機能をうまく発揮できるように設計されているので、「一つのことをきちんとやる」というマントラのような不必要な機能を使わずに、あるコマンドの出力が別のコマンドの入力になるように、コマンド文字列をパイプでつなぐことができるのです。それぞれのコマンドがユニークなセンスを発揮し、気がつけば勝利のチームが出来上がっていることでしょう。

簡単な例

例えば、あるディレクトリに様々な種類のファイルが入っているとします。そのディレクトリにある特定の種類のファイルが何個あるか知りたい。他にも方法はありますが、この演習の目的はパイプラインの導入ですので、そのためにパイプラインを使用します。

lsを使えば、簡単に文書の一覧を得ることができる。

ls

ファイル名またはファイル拡張子に「page」という単語が含まれるファイルを探したい。

シェルの特殊文字「|」を使って、lsの出力をgrepにパイプすることにします。

ls | grep "page"

grepは検索パターンにマッチした行を出力するので、この場合は「.page」ファイルだけのリストが得られます。

この些細な例でも、パイプラインの機能を示すことができます。これは、grep コマンドが使用するデータとして grep に送られます。私たちが見る出力は、連鎖の最後のコマンドである grep からのものです。

チェーン展開

パイプラインのコマンドチェーンを拡張することから始めましょう。wcコマンドを追加することで、「.page」ファイルを数えることができる。ここでは、wcの-l(行数)オプションを使用することにします。なお、lsには-l(ロングフォーマット)オプションも追加されています。もうすぐ必要になる。

ls - | grep "page" | wc -l

grep はもはや連鎖の最後のコマンドではないので、その出力は見られません。grep の出力は wc コマンドに供給されます。ターミナルウィンドウに表示される出力は、wcからのものです。wcは、ディレクトリ内に69個の「.page」ファイルがあることを報告しています。

少し拡大解釈してみましょう。コマンドラインから wc コマンドを削除し、awk に置き換えます。 ls は -l (long format) オプションで 9 カラムの出力を持ちます。awk を使って、5 列目、3 列目、9 列目を表示することにします。これらは、ファイルのサイズ、所有者、名前です。

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}'

一致した各ファイルについて、これらの列のリストを取得する。

この出力をsortコマンドに通してみよう。-n(数字)オプションを使って、最初の列が数字として扱われることをsortに知らせよう。

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n

出力はファイルサイズ順にソートされ、3つのカラムをカスタムで選択しました。

その他のコマンドを追加する

最後にtailコマンドを追加し、出力の最後の5行だけをリストアップするように指示します。

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n | tail -5

つまり、このコマンドは、「このディレクトリにある".page "ファイルのうち、大きいものを5つ、サイズ順に表示してください」というような意味に変換されます。".もちろん、こんなことができるコマンドはありませんが、パイプを使うことで、独自のファイルを作っているのです。このコマンドや他の長いコマンドをエイリアスやシェル関数として追加することで、入力したすべての内容を保存することができます。

以下の出力が可能です。

sortコマンドに-r(reverse)オプションを付けて、tailの代わりにheadを使って出力の先頭から行をピックアップすることで、サイズの順序を逆にすることができます。

007Ys3FFgy1gp62qr8qd2j30hy025jrd

今回は、「.page」ファイルの大きいものから順に5つ並べました。

最近の事例

最近のHow To geekの記事から、興味深い例を2つご紹介します。

いくつかのコマンド(xargscommandなど)は、入力がパイプで送られるように設計されています。ここでは、wcに複数のファイルの単語、文字、行をカウントさせる方法の1つとして、lsをxargsにパイプし、ファイル名のリストをコマンドラインの引数としてwcに渡します。

ls *.page | xargs wc

単語数、文字数、行数の合計がターミナルウィンドウの下部に表示されます。

ここでは、カレントディレクトリにあるユニークなファイル拡張子を種類ごとにカウントして、ソートされたリストを取得する方法を紹介します。

ls | rev | cut -d'.' -f1 | rev | sort | uniq -c

いろいろあるんですよ。

  • ls: ディレクトリ内のファイルを一覧表示します。
  • rev: ファイル名のテキストを反転させます。
  • カット:指定したセパレータ". "が最初に現れる位置で文字列をカットします。
  • rev: 残りのテキスト、すなわちファイル拡張子を反転させます。
  • Sort:リストをアルファベット順に並べ替えます。
  • uniq: リスト内の各ユニーク項目の数を数える。

出力は、アルファベット順のファイル拡張子のリストと、ユニークなタイプごとのカウントを表示します。

パイプラインのネーミング

名前付きパイプと呼ばれる別のタイプのパイプを使うことができます。先ほどの例のパイプは、シェルがコマンドラインを処理する際に動的に作成されたものです。パイプは作成され、使用され、そして廃棄される。それらは儚く、痕跡を残さない。これらは、それらを使用するコマンドが実行されたときにのみ存在します。

名前付きパイプはファイルシステム上の永続的なオブジェクトとして表示されるので、lsを使用して表示することができます。コンピュータを再起動した後も、未読のデータは破棄されるが、存在し続けるという意味で、永続的である。

名前付きパイプは、異なるプロセスでデータを送受信するために一時期よく使われましたが、このような使い方は長い間見ていません。今でも効果的に使っている人がいるのは間違いないのですが、最近は出会えませんね。しかし、念のため、あるいは好奇心を満たすために、いくつかの使い方をご紹介しましょう。

名前付きパイプは、mkfifoコマンドで作成します。このコマンドは、カレントディレクトリに "geek pipe "という名前のパイプを作成します。

mkfifo geek-pipe

lsコマンドに-l(ロングフォーマット)オプションを付けると、名前付きパイプの詳細を見ることができます。

ls -l geek-pipe

リストの最初の文字は、パイプであることを示す "p "である。d "はファイルシステムオブジェクトがディレクトリであることを示し、ダッシュ"-"は通常のファイルであることを示す。

名前付きパイプの使用

パイプを使おう。前の例で使った無名のパイプは、送信コマンドから受信コマンドにすぐにデータを渡します。指定されたパイプを通して送られたデータは、読み込まれるまでパイプに残ります。実際にデータはメモリ上に保持されるので、lsリストにデータがあってもなくても、名前付きパイプのサイズは変わりません。

この例では、2つのターミナルウィンドウを使用します。

# Terminal-1

ターミナルウィンドウで

# Terminal-2

ハッシュ「#」は、その後にコメントが続くことをシェルに伝え、無視されます。

先ほどの内容を全て名前付きパイプにリダイレクトしてみましょう。このように、1つのコマンドで無名パイプと名前付きパイプの両方を使います。

ls | rev | cut -d'.' -f1 | rev | sort | uniq -c > geek-pipe

大きな変化はなさそうですが、コマンドプロンプトに戻れないので、何かが起きていることにお気づきでしょうか。

別の端末ウィンドウで、次のコマンドを実行します。

cat < geek-pipe

名前付きパイプの内容をcatにリダイレクトして、catがその内容を第二のターミナルウィンドウに表示するようにしています。出力は次のようになります。

最初のターミナルウィンドウにコマンドプロンプトに戻ることが確認できます。

で、今何が起こったかというと。

  • ある出力を指定されたパイプラインにリダイレクトします。
  • 最初のターミナルウィンドウがコマンドプロンプトに戻りません。
  • 第2端末のパイプラインから読み出されるまで、パイプラインにデータが残ります。
  • 最初のターミナルウィンドウのコマンドプロンプトに戻ります。

と思われるかもしれませんが、コマンドの末尾に&amp;をつけることで、最初のターミナルウィンドウでバックグラウンドタスクとして実行することができます。その通りでしょう。この場合、すぐにコマンドプロンプトに戻ります。

バックグラウンド処理を使用しないのは、名前付きパイプがブロック処理であることを強調するためである。名前の付いたパイプに何かを入れても、パイプの一端が開くだけです。もう一方の端は、読み取り処理によってデータが抽出されるまで開かない。カーネルは、パイプのもう一方の端からデータが読み込まれるまで、最初のターミナルウィンドウのプロセスをハングアップさせる。

パイプラインの力

今日、パイプラインに名前を付けることは斬新なことです。

一方,Linux のパイプラインは,ターミナルウィンドウのツールボックスの中で最も便利なツールの一つです.Linux のコマンドラインはあなたのために命を吹き込み始め,コマンドのグループを調整してまとまったパフォーマンスを生み出すことができれば,全く新しいダイナミズムを得ることができます.

プロからのアドバイス:パイプラインコマンドは、1つずつコマンドを追加していき、その部分がきちんと動くようにしてから、次のコマンドでパイプラインを使うように書くとよいでしょう。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ