正規表現とパイプ

標準入出力

 Linuxのプログラムには「一つの入り口と二つの出口」が存在する。それぞれを、標準入力、標準出力、標準エラー出力という。

標準入力

 標準入力は、プログラムに入ってくるデータのことを示す。標準入力先は一般的にはキーボードになっている。

標準出力

   標準出力はプログラムの実行結果を書き出す先のことを示す。標準出力は一般的にはプログラムを実行した端末のディスプレイになっている。

標準エラー出力

 標準エラー出力はエラーメッセージを書き出す先のことを示す。標準エラー出力は一般的にプログラムを実行した端末のディスプレイになっている。

 例えばlsコマンドを実行した場合にカレントディレクトリのファイルとディレクトリが画面上に表示される。このように、コマンドを実行した結果が画面上に表示されることを、「標準出力に出力された」と表現する。

リダイレクト

 コンソールに標準出力された文字列をリダイレクトを使って、ファイルに書き込むことができる。リダイレクトは( > )を使って表す。

$ ls > ls-output

 コマンドを実行すると,「ls-output」というファイルが作例され、lsを実行した時と同じ内容が含まれている。このようにリダイレクトを用いると、出力先を変更に、ファイルに格納することができる。

 既に、「ls-output」ファイルが存在する場合は前の「ls-output」が削除され、新しい「ls-output」が作成される。上書きをせずに追記したい場合はアペンド( >> )を用いる。

catコマンドによるファイル作成

 catコマンドもリダイレクトを組み合わせるとファイルを作成することができる。

$ cat > cat-output
hello
This is cta redirect.
([Ctrl] D を押す)
$

 「 Ctrl 」 + D は EOF (End Of File) を示すキーで、データ入力の終わりを示す。Linuxではデータの読み込みが最後となると、このEOFが入力され終わる決まりが存在する。

 catはEOFを受け取ったことで「入力が終わった」と判断し、リダイレクトを終了する。

標準エラー出力

 コンピューターを操作していると様々なエラーが起きることがある。エラー画面はログに出力される。

$ ls -l tekitou > ls-l-output
ls: tekitou: No such file or directory

 エラーメッセージは通常、標準出力されるが、リダイレクトを用いて任意のファイルにファイル出力することもできる。

$  ls -l tekitou 2> ls-l-output
( エラー出力を ls-l-output にリダイレクトしている)

 この場合はエラーメッセージは画面上に表示されず、指定したファイルに出力される。コマンド中で指定している'2'は標準エラー出力を示している。標準出力は'1'を指定する。

 標準出力と標準エラー出力を一つのファイルに出力したい場合は次のように入力する。

$ ls -l tekitou > ls-l-output-second 2>&1

パイプ

 標準出力からデータを入れることにより、特別な処理ができるコマンドがある。

$ ls -l /usr/bin 

 上のコマンドを入力すると、画面上にファイル一覧が流れるが/usr/bin にはコマンドが1000以上存在するため、そのままでは全てのコマンドを画面に表示しきることができない。

 そこで、次のように入力する

$ ls -l /usr/bin | less

 lessはページャのlessコマンドである。(ページャはページングを実現してくれるコマンド)

 コマンドとパイプ ( | ) でつなげることで、パイプの前のコマンドを後ろのコマンドの標準入力とすることができる。

 端末をリモート操作している場合や、デスクトップ環境がインストールされていないLinux環境の場合は、パイプでつなげる方法を知っていると便利である。

 先述した「標準出力と標準エラー出力を一つのファイルに出力する方法」もパイプを使ってページングすることができる。

$ ls -l hoge /usr/bin 2>&1 | less

 hogeは存在しないが、その旨のメッセージはリダイレクトにより標準出力に出力される。

grepコマンド

 grepコマンドは、ファイルの中からデータを検索する。また、|grep とすることで,標準入力から入ったデータに対し検索を行うことも可能である。

$ grep [オプション] 検索条件 [指定ファイル]

 指定ファイルの部分は一つでも、*のようなワイルドカードを利用した複数ファイルの指定も可能である。(ワイルドカードは不特定の文字列を表現するのに利用される記号のことである)

 検索条件として、正規表現が用いられる。正規表現grepコマンドのみならず、Linuxで用いられるパターンマッチや、多くのプログラミング言語でも利用される非常に重要な機能である。

正規表現

 正規表現は文字列のみならず、意味のある記号を用いることで、高度な検索条件を与える表現方法である。主に用いられる記号は以下の通りである。

記号 意味
^ 行頭を表す
$ 行末を表す
. 任意の一字を意味する 
直前の文字の0回以上の繰り返しを意味する
[...] ..の中の任意の一字を意味する
[^...] ..の文字が含まれないことを意味する 
\ 正規表現の記号をエスケープする 

正規表現の利用例

 記号 意味
^a aで始まっている行
b$ bで終わっている行
a.b aとbの間に一文字入っている
[ab]ab aもしくはbに続くab ( 例:aab,bab )
[^ab]ab aもしくはbで始まらない( not ) で、abが続くもの ( 例: xab,zab )

オプション

記号 意味 
-v 検索パターンとマッチしなかった行を選択する
-e 文字列を検索パターンとして扱う
-i 検索パターンと入力ファイルの双方で、英大文字と小文字の区別を行わない

標準出力にマッチさせる

 grepコマンドはファイルの内容に一致させる以外に、標準入力からの入力をマッチさせることができる。

$ ls /usr/bin | grep -e d$
xcodebuild
xed
xxd
(ファイル名がdで終わるファイルを/usr/binから検索している)