はじめに
正規表現とパイプ
正規表現はLinuxの様々な処理で使われることが多いため、理解しておくべきとのこと。
標準入出力
Linuxプログラムには、「1つの入り口と、2つの出口」がある。
それぞれ、標準入力と標準出力・標準エラー出力である。
標準入力は、プログラムに入ってくるデータのことを示す。標準入力先は一般的にはキーボード。
標準出力は、プログラムの実行結果を書き出す先を示す。あくまでも書き出す先なので実行結果のことではない。
→そのため、何かコマンドを実行した結果が画面上に表示されることを、「標準出力に出力された」という。
標準エラー出力は、エラーメッセージを書き出す先のことを示す。
上記二つの出力は、一般的にはプログラムを実行した端末のディスプレイになっている。
リダイレクト
リダイレクトは、出力の向かう先を変更すること。
Linuxでは、リダイレクト「>」
を用いて標準出力や標準エラー出力の向かう先を変更することができる。
リダイレクトを用いることで、出力をファイルに書き込むこともできる。
出力のリダイレクト
以下はリダイレクトの実行例である。
ls > ls-output
上記コマンドを実行すると、ls(参照)の結果が、ls-outputというファイルに記載される。
ls-outputファイルがない場合は、新しく作成される。ls-outputファイルがすでにある場合は、前のls-outputファイルの中身が削除され、新しく作成される。
上書きせず、追記したい場合は、アペンド「>>」
を使う。
catコマンドによるファイル作成
catコマンドとリダイレクトを組み合わせることで、自由な内容のファイルを作成できる。
実行例
$ cat > cat-output
Hello
This is cat redirect
catコマンドとリダイレクトを用いることで、自由にファイルに記載できる。また、入力を終わらせる場合は、Ctrl + D
で終了できる。
Linuxでは、Ctrl + D
で入力の終了をする。
標準エラー出力
コンピュータを操作していると、様々なエラーが起きることがある。エラーは画面とログに出力される。
エラーメッセージは通常標準出力されるが、リダイレクトを用いて任意のファイルにファイル出力をすることもできる。
例)ls -l aiueo 2> ls-l-output
aiueoというディレクトリがない場合、「ディレクトリがないです」という旨のエラ〜メッセージがls-l-outputファイルに出力される。
この「2」というのは標準エラー出力を示している。「1」と指定すると、標準出力になる。
エラーメッセージを出力したいなら「2」を指定し、プログラムの実行結果を出力したいなら「1」を指定すればよい。
パイプ
標準入力からデータを入れることにより、特別な処理ができる。
コマンドとコマンドをパイプ「|」でつなげる(前コマンドの出口と後コマンドの入り口をパイプでつなげる)ことで、コマンド間でデータの受け渡しができる。
そのため、前のコマンドの出力結果を後ろのコマンドの標準入力に渡すことができる。
ls -l /user/bin | less
ls -l /user/bin
だけだと、表示されるものが多く全てを表示することはできないが、パイプを用いてless
とつなげることで、ls -l /user/bin
の標準出力をless
の標準入力にできる。
grepコマンド
grepコマンドは、ファイルの中からデータを検索することができる。
また、先ほどのパイプと一緒に使うことで、標準出力の結果から検索することができる。
書式:grep [オプション] 検索条件 [指定ファイル]
検索する上で、ワイルドカードなどを用いることもできるが、検索条件として正規表現が用いられる。
オプション
オプション | 詳細 |
---|---|
-e | 文字列を検索パターンとして扱う |
-i | 検索パターンと入力ファイルの双方で、英大文字と小文字の区別を行わない |
-v | 検索パターンとマッチしなかった行を選択する |
正規表現
正規表現で使われる記号と意味
記号 | 意味 |
---|---|
^ | 行頭を表す |
$ | 行末を表す |
. | 任意の一字を意味する |
* | 直前文字の0回以上の繰り返しを意味する |
[...] | ..の中の任意の一字を意味する |
[^...] | ..の文字が含まれないことを意味する |
¥ | 正規表現の記号をエスケープする |
使用例
^test → testから始まるものを検索
test$ → testで終わるものを検索
te.t → teとtの間に任意の一文字が入っているものを検索
[ab]test → aもしくはbに続くもの(atestやbtest)を検索
[^ab]test → aもしくはbで始まらないもの(ctest,etestなど)を検索
パイプやオプションを組み合わせると、このようなこともできる
grep abc /etc/* | grep -v tcp
こちらのコマンドは、/etcディレクトリにある、abcという文字列を含み、tcpという文字を含まないファイルを検索している。
まとめ
今回は第4章についてまとめました。
ここの章くらいから、普段あまり使ったことのないコマンドがでてきたので、いろいろ触ってみようと思います。