1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルフィルタの具体的な使用方法

2022-02-12 09:37:23

すでにご存知のように、いくつかのコマンドをパイプ文字で結合してパイプを形成します。このように使われるコマンドは、しばしばフィルターと呼ばれます。フィルタは入力を受け取り、それを何らかの方法で変更し、出力する。

要するに、フィルターをまとめると、次のようになる。

  • Linuxのコマンドで、標準入力から入力データを受け取り、標準出力に出力データ(結果)を出すものをフィルタと呼ぶ。
  • フィルターは、Linuxのパイプラインと組み合わせて使われることが多いです。

フィルターとしてよく使われるコマンドを以下に示します。

<テーブル コマンド 説明 アキ テキスト処理のための解釈型プログラミング言語で、データ抽出やレポート作成のツールとしてよく使われる。 カット 各入力ファイル(ファイルが指定されていない場合は標準入力)の各行の指定された部分を標準出力に出力するのに使用します。 グレップ 1つまたは複数のファイルから、指定されたパターンに一致する行を検索するために使用します。 タール ファイルをアーカイブするためのアプリケーションです。 ヘッド ファイルの先頭を読み込むのに使用します(デフォルトは10行)。ファイルを指定しない場合は、標準入力から読み込む。 ペースト ファイルをマージするための行です。 セッド テキストのフィルタリングや変換を行うストリームエディタ。 ソート テキストファイルの行をソートするために使用します。 スプリット ファイルをチャンクに分割するときに使用します。 文字列 ファイル内の印刷可能な文字列を印刷するために使用します。 タック catコマンドの逆で、ファイルやリンクされたファイルを逆順に表示するために使用します。 テール ファイルの終端を表示するために使用します。 ティー 標準入力から内容を読み取り、標準出力とファイルに書き込むために使用します。 tr 文字の変換や削除に使用します。 ユニック 重複した行を報告または無視するために使用されます。 wc ファイルの総行数、総ワード数、総バイト数を表示するために使用します。

次に、いくつかの例でフィルターの使い方を説明します。

パイプラインで awk コマンドを使用する

awk コマンドの具体的な使用法については、ご自身で勉強してください。この節では、パイプラインで awk コマンドを使用するいくつかの簡単な例を見ていくだけです。

例1

システム内のすべてのアカウント名を表示し、名前のアルファベット順に並べ替えることができます。

[jb51.net]$ awk -F: '{print $1}' /etc/passwd | sort
adm
apache
avahi
avahi-autoipd
bin
avahi-autoipd
dbus
ftp
games
...


上記の例では、ファイル /etc/passwd の内容をコロン: をカラムの区切りとして複数のカラムに分割し、最初のカラムの情報(つまりユーザー名)を出力し、その出力を sort コマンドにパイプで渡しています。

例2

現在のアカウントで最も頻繁に使用される10個のコマンドをリストアップします。

[jb51.net]$ history | awk '{print $2}' | sort | uniq -c | sort -rn | head
140 echo
 75 man
 71 cat
 63 su
 53 ls
 50 vi
 47 cd
 40 date
 26 let
 25 paste


上の例では、history コマンドが出力を awk コマンドにパイプし、デフォルトではスペースを列の区切りとして使い、history の出力を 2 列に分け、2 列目を出力としてパイプを通して sort コマンドに送っています。 コマンドを実行し、uniq コマンドの出力を最高から最低に並べ替え、最後に head コマンドを使ってデフォルトで上位 10 名をリストアップしています。

例3

現在のシステムメモリの合計サイズをKB単位で表示します。

[jb51.net]$ free | grep Mem | awk '{print $2}'
2029860


パイプラインでcutコマンドを使用する

cutコマンドは、テキスト処理に使用されます。このコマンドを使うと、ファイル内の指定した列の内容を取り出すことができます。

例1

ログインシェルが "/bin/bash" のシステムで、ユーザー名と対応するユーザーホームディレクトリの情報を表示する場合。

[jb51.net]$ grep "bin/bash" /etc/passwd | cut -d: -f1,6
root:/root
mozhiyan:/home/mozhiyan


Linuxに詳しい方なら、/ctc/passwdファイルがユーザーアカウントに関する情報を保存するために使用されていることはご存知でしょう。このファイルの各行は、アカウントに関する情報を記録しており、各フィールドはコロンで区切られ、最初のフィールドはアカウントのアカウント名、6番目のフィールドはそのアカウントのホームディレクトリへのパスです。

例2

現在のマシンのCPUの種類を表示します。

[jb51.net]$ cat /proc/cpuinfo | grep name | cut -d: -f2 | uniq
Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz


上記の例で、cat /proc/cpuinfo | grep nameのコマンドを実行すると、次のようになります。

[jb51.net]$ cat /proc/cpuinfo | grep name
model name : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name : Intel(R) Core(TM) i5-2520M CPU 0 2.50GHz


次に、cutコマンドで上記の出力をコロンで区切って2列に分割し、2列目を表示し、最後にuniqコマンドで重複する行を削除しました。

例3

カレントディレクトリのサブディレクトリの数を表示します。

[jb51.net]$ ls -l | cut -c 1 | grep d | wc -l
5


上記のパイプラインコマンドは、以下のような動作をします。

  • コマンド ls -l の出力の各行の最初の文字はファイルの種類を表し、最初の文字が d ならばファイルの種類はディレクトリであることを意味します。
  • コマンドcut -c 1は、各行の最初の文字を横取りするものです。
  • ファイルタイプがdirectoryの行を取得するコマンドgrep d。
  • wc -l コマンドは、grep コマンドの出力に含まれる行数、つまりディレクトリの数を取得するために使用します。

パイプラインでgrepコマンドを使用する

grepコマンドは、パイプラインでよく使われるコマンドの1つです。

例1

システムログファイルのエラーメッセージを表示する。

[jb51.net]$ grep -i "error:" /var/log/messages | less



例2

システム上の HTTP サービスのプロセス情報を表示します。

[jb51.net]$ ps auxwww | grep httpd
apache 18968 0.0 0.0 26472 10404 ?  S Dec15 0:01 /usr/sbin/httpd
apache 18969 0.0 0.0 25528 8308 ?  S Dec15 0:01 /usr/sbin/httpd
apache 18970 0.0 0.0 0.0 26596 10524 ?  S Dec15 0:01 /usr/sbin/httpd


例3

プログラムリストで、コマンド名にzipというキーワードを含むすべてのコマンドを検索します。

[jb51.net]$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
gunzip
gzip


例4
システムにインストールされているカーネルバージョンと関連するカーネルパッケージが表示されます。

[jb51.net]$ rpm -qa | grep kernel
kernel-2.6.18-92.e15
kernel-debuginfo-2.6.18-92.e15
kernel-debuginfo-common-2.6.18-92.e15
kernel-devel-2.6.18-92.e15

例5

etc ディレクトリにある IP アドレスを含むすべてのファイルを検索します。

[jb51.net]$ find /etc -type f -exec grep '[0-9][0-9]*[.] [0-9][0-9]*[.] [0-9][0-9]*[.] [0-9][0-9]*' {} \;


パイプラインでtarコマンドを使用する

tar コマンドは、Linux システムでファイルをパッケージ化するために最もよく使用されるプログラムです。

例1

tarコマンドを使えば、ディレクトリの構造を丸ごとコピーすることができます。

[jb51.net]$ tar cf - /home/mozhiyan | ( cd /backup/; tar xf - )


例2
ディレクトリの全体構造をネットワーク上に複製する。

[jb51.net]$ tar cf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xf - )"



例3
ネットワーク上のディレクトリの全体構造を圧縮して複製します。

[jb51.net]$ tar czf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xzf - )"


例4
tar アーカイブのサイズをバイト単位で確認します。

[jb51.net]$ cd /; tar cf - etc | wc -c
215040

例5
tarアーカイブを圧縮してtar.gzクロッチファイルにした後のサイズを確認します。

[jb51.net]$ tar czf - etc.tar | wc -c
58006

例6
tarアーカイブをtar.bz2クロッチファイルに圧縮した後のサイズを確認します。

[jb51.net]$ tar cjf - etc.tar | wc -c
50708

パイプラインでheadコマンドを使用する

コマンドの出力のすべてが必要なわけではなく、最初の数行だけが必要な場合があります。この場合、headコマンドを使用すると、コマンドの出力の最初の数行だけを表示することができます。デフォルトの出力行数は10行です。

例1

ls コマンドの出力のうち、最初の 10 行を表示します。

[jb51.net]$ ls /usr/bin | head
addftinfo
afmtodit
apropos
arch
ash
awk
base64
basename
bash
bashbug


例2
lsコマンドの最初の5行を表示します。

[jb51.net]$ ls / | head -n 5
bin
cygdrive
Cygwin.bat
Cygwin.ico
Cygwin-Terminal.ico


パイプラインでuniqコマンドを使用する

uniqコマンドは、重複する行を報告したり、削除したりするために使用します。ここでは、パイプラインで uniq コマンドを使用する例として、以下のようなテストファイルを使用します。

[jb51.net]$ cat testfile
This line occurs only once.
This line occurs twice.
This line occurs twice.
This line occurs three times.
This line occurs three times.
This line occurs three times.


例1
出力から重複した行を削除します。

[jb51.net]$ sort testfile | uniq
This line occurs only once.
This line occurs three times.
This line occurs twice.


例2
出力中の各繰り返し行の出現回数を番号の逆順で表示します。

[jb51.net]$ sort testfile | uniq -c | sort -nr
3 This line occurs three times.
2 This line occurs twice.
1 This line occurs only once.


パイプラインでwcコマンドを使用する

wcコマンドは、テキストストリームに含まれる文字数、シングルトン数、行数をカウントするために使用されます。

例1
現在システムにログインしているユーザーの数を数える。

[jb51.net]$ who | wc -l


例2
現在の Linux システムのプロセス数をカウントする。

[jb51.net]$ ps -ef | wc -l

シェルフィルターについての詳しい情報は、スクリプトハウスの過去の記事を検索していただくか、下記の関連記事を引き続き閲覧してください。