【Linux】パイプライン

ここまで、コマンドのリダイレクトについて学びました。具体的な記事はこちらです。

【Linux】標準入出力

2022年5月15日

今回の記事では「パイプライン」について学びます。複数のコマンドを連携させるためにはコマンドの別の結果を別の困んで利用する仕組みが必要です。そこで、Linuxでは、コマンドの標準出力を別のコマンドの標準入力に繋ぐ「パイプライン」という昨日でコマンド連携させることが可能です。

例えば、ls実行時に沢山のファイルがおおくあり、表示結果が一画面内に収まらない事があったとします。この時、lsコマンドの結果を一度ファイルにリダイレクトして、lessコマンドによりその後からそのファイルを閲覧する方法があります。

ls -l / > temp_list.txt
less temp_list.txt

しかし、コマンドを実行するたびに毎回中間ファイルを作成するのは煩わしいです。そこで、中間ファイルを作成せずに、一つのコマンドの結果を別のコマンドに直接送り込んでコマンドを連携させる昨日がパイプラインです。パイプラインは |(パイプ) という記号を使って次のように書きます。

<コマンド1> | <コマンド2>

 

例えば、一つ目のコマンドの ls -l / の標準出力が、二つ目のコマンドlessの標準入力になります。

user@computer$ ls -l / less
total 1436
lrwxrwxrwx   1 root root       7 Mar 25 06:40 bin -> usr/bin
drwxr-xr-x   2 root root    4096 Mar 25 06:47 boot
drwxr-xr-x   8 root root    2760 May 16 15:52 dev
drwxr-xr-x 135 root root   12288 May 16 15:52 etc
drwxr-xr-x   3 root root    4096 May  8 13:06 home
-rwxr-xr-x   3 root root 1392928 Apr 14 16:39 init
lrwxrwxrwx   1 root root       7 Mar 25 06:40 lib -> usr/lib
lrwxrwxrwx   1 root root       9 Mar 25 06:40 lib32 -> usr/lib32
lrwxrwxrwx   1 root root       9 Mar 25 06:40 lib64 -> usr/lib64
lrwxrwxrwx   1 root root      10 Mar 25 06:40 libx32 -> usr/libx32
drwx——   2 root root   16384 Apr 11  2019 lost+found
drwxr-xr-x   2 root root    4096 Mar 25 06:40 media
drwxr-xr-x   5 root root    4096 May  8 13:06 mnt
drwxr-xr-x   3 root root    4096 May 10 19:36 opt
dr-xr-xr-x 202 root root       0 May 16 15:52 proc
drwx——   3 root root    4096 May 13 17:11 root
drwxr-xr-x   6 root root     120 May 16 15:52 run
lrwxrwxrwx   1 root root       8 Mar 25 06:40 sbin -> usr/sbin
drwxr-xr-x   6 root root    4096 Mar 25 06:42 snap
drwxr-xr-x   2 root root    4096 Mar 25 06:40 srv
dr-xr-xr-x  11 root root       0 May 16 15:52 sys
drwxrwxrwt  11 root root    4096 May 15 15:37 tmp
drwxr-xr-x  14 root root    4096 Mar 25 06:41 usr
drwxr-xr-x  13 root root    4096 Mar 25 06:42 var
(END)

lessコマンドもcatコマンド同様に、ファイルを指定しない場合は標準入力を入力として読み込みます。そのため、次の例では、結果として、lsコマンドの出力をlessコマンドで閲覧できます。これはコマンドの表示結果が長くなるときによく使われます。

このほかにも標準出力に結果を表示するコマンドは、何でもパイプでlessに繋ぐことが可能です。historyというコマンドでのパイプラインの使用例を示します。

bashに入力したコマンドラインは、~/.bash_historyというファイルに履歴として保存されます。これをコマンドライン履歴と呼びます。保存されたコマンドライン履歴は、次のようにhistoryコマンドで表示可能です。

user@computer$ history | less
1  exit
2  vim
3  vim remote.txt
4  cat remote.txt
5  sudo /etc/init.d/xrdp start
6  docker
7  sudp apt update
8  sudp apt-get update
9  sudo apt-get update
                                                                                             

コマンドライン履歴が多くある時は画面内に表示できませんが、lessをパイプラインで連携することで1ページずつ閲覧可能です。

パイプラインは|を複数使うことで、好きなだけ繋げることが可能です。

次の例では、

1.lsのコマンド結果をcatコマンドにより行番号付きで表示

2.表示した結果をlessで一ページずつ閲覧

user@computer$ ls -l /etc |cat -n | less
1  total 1040
2  drwxr-xr-x  7 root root       4096 May  8 13:10 NetworkManager
3  drwxr-xr-x  2 root root       4096 Mar 25 06:42 PackageKit
4  drwxr-xr-x  2 root root       4096 May  8 13:10 UPower
                                                            

このようにコマンドをパイプラインで繋げることで、シンプルな機能を持ったコマンドをモジュールとして応用し、様々な処理を可能とします。

次のパイプラインは標準出力だけを次のコマンドに送ります。標準エラー出力もまとめて、パイプラインに送りたい場合、2>&1を応用して、標準エラー出力を標準出力へリダイレクトしておくことも可能です。

次の例は、lsコマンドの標準出力と標準出力エラーの両方をlessコマンドで閲覧しています。

ls -l / /xxxxx 2>&1 | less

スポンサードサーチ

まとめ

今回の記事ではコマンドをつなげ合わせることで様々な処理を可能とするパイプラインについて紹介しました。次回はフィルタについて紹介します。

 

コメントを残す

メールアドレスが公開されることはありません。