今回は正規表現とそれを使用するLinuxの主要コマンドについて学びます。
正規表現
正規表現は特定の条件を表す文字列を抽象的な表現に置き換えたものです。
ファイルの検索などで完全一致の検索ではなく特定の条件にて検索を行いたい場合に使用します。
Linuxのコマンドライン以外でもほぼ同様の表現が使用されるため、覚えておくとLinux以外の場面でも使用できるシーンがあるでしょう。
正規表現記号 | 説明 |
---|---|
. | 任意の1文字 |
* | 直前の文字の0回以上の繰り返し |
[] | []内のいずれかの1文字 |
^ | 行頭 |
$ | 行末 |
¥ | 次の1文字をエスケープ(バックスラッシュ) |
・拡張正規表現
正規表現記号 | 説明 |
---|---|
+ | 直前の文字の1回以上の繰り返し |
? | 直前の文字の0回もしくは1回の繰り返し |
| | 左右いずれかの文字 |
「^」などの記号は文字クラスの外と中で意味が違ってくるので注意。よく間違える。
外で使用された場合には行頭を表し、中で使用すると指定文字列(表現)以外を指す。
grepコマンド
grepコマンドはファイルや標準入力の内容から正規表現を含む検索文字列が存在するかどうかを調べるコマンドです。
試験的にも重要ですが、実用度が非常に高いため試験対策として覚えた内容はそのまま実用的にも活用できる場面があると思います。
単純な使用であれば簡単ですが、様々な使用方法は覚えておくべきだと思います。
[wantan@localhost lpic]$ ll | grep test -rw-rw-r--. 1 wantan wantan 49 8月 10 01:06 test.txt -rw-rw-r--. 1 wantan wantan 62 8月 9 22:47 testfile.txt
オプション
オプション | 内容 |
---|---|
-c | パターンがマッチした行数を表示 |
-f | 検索パターンをファイルから読み込む |
-i | 大文字小文字の区別なしに検索 |
-n | 検索結果に行番号を表示 |
-v | マッチしない行を表示 |
-E | 拡張正規表現を使用 |
■小文字大文字の区別なく検索
普通にgrepコマンドをかけると小文字大文字を区別して検索を行うので、区別しない場合はオプションを使用する。
[wantan@localhost lpic]$ ll | grep TEST [wantan@localhost lpic]$ ll | grep -i TEST -rw-rw-r--. 1 wantan wantan 49 8月 10 01:06 test.txt -rw-rw-r--. 1 wantan wantan 62 8月 9 22:47 testfile.txt
■検索パターンをファイルから読み込む
実際には毎回打ち込みをするのがしんどい正規表現などで使うべきところだと思います。
以下の例では固定文字列のファイルを用意して読み込みます。
[wantan@localhost lpic]$ cat patern test [wantan@localhost lpic]$ ll | grep -f patern -rw-rw-r--. 1 wantan wantan 49 8月 10 01:06 test.txt -rw-rw-r--. 1 wantan wantan 62 8月 9 22:47 testfile.txt
■検索結果に行番号に表示
[wantan@localhost lpic]$ ll | grep -n test 8:-rw-rw-r--. 1 wantan wantan 49 8月 10 01:06 test.txt 9:-rw-rw-r--. 1 wantan wantan 62 8月 9 22:47 testfile.txt
■指定文字列にマッチしない行を表示する
通常のgrepの逆の結果を表示する。
[wantan@localhost lpic]$ ll | grep -v test 合計 96 -rw-rw-r--. 1 wantan wantan 10 8月 10 00:28 alpha.txt -rw-rw-r--. 1 wantan wantan 24 8月 9 23:27 cutfile.txt drwxrwxr-x. 2 wantan wantan 70 8月 10 06:45 file -rw-rw-r--. 1 wantan wantan 51 8月 10 05:23 num.txt -rw-rw-r--. 1 wantan wantan 5 8月 13 01:09 patern -rw-rw-r--. 1 wantan wantan 70 8月 10 05:04 sort.txt -rw-rw-r--. 1 wantan wantan 64884 7月 31 19:06 top.log -rw-rw-r--. 1 wantan wantan 17 8月 10 05:48 uniq.txt
■拡張正規表現を使用する
通常のgrepコマンドでは、拡張表現を適用されますが、拡張正規表現を使用されません。
拡張正規表現を使用するには、「-E」オプションか、「egrep」コマンドを使用します。
[wantan@localhost lpic]$ cat test.txt | grep ^'a|b' [wantan@localhost lpic]$ cat test.txt | grep -E ^'a|b' abcd abbb bbbd accb
■正規表現を使用せずに検索する
grepコマンドでは正規表現が使用されるので、正規表現で使用される文字自体を検索文字列としたい場合には明示的にfgrepコマンドを使用する必要があります。
[wantan@localhost lpic]$ cat test.txt | grep ^ test hello ABCD hellohello 12345 wantan 0000000 abcd abbb bbbd accb cdcd test^^^ [wantan@localhost lpic]$ cat test.txt | fgrep ^ test^^^
sedコマンド
sedコマンドはテキストに対して特定の編集を行うコマンドです。
実用的にはかなり使えるコマンドだと思いますが、grepコマンドと比較すると若干敷居が高くLinuxにあまり触れない人は馴染みがないかもしれません。私も実践では使用したことがないです。
試験的には出題されるようなので、基本的な使い方は覚えておく必要があるかと思います。
sedコマンドについてはオプションとsed内で使用するコマンドが存在します。
オプション
オプション | 内容 |
---|---|
-f [ファイル] | スクリプトファイルを指定する |
-i | 処理した内容でファイルを上書き |
コマンド
オプション | 内容 |
---|---|
d | マッチした行を削除 |
s | パターンに基づき置換 |
y | 文字を変換 |
コマンドパターン
上記のコマンドは使い方をしっかり覚えておく必要があるので、簡単に振り返っておきます。
・最初に現れる文字列1を文字列2に置換
通常のパターンだと当該行の一番最初に現れる文字列しか置換しないので注意。
sed s/[文字列1]/[文字列2]/ test.txt
・全ての文字列1を文字列2に置換
当該行の全ての文字列を置換するには末尾にgを付与する必要があります。
sed s/[文字列1]/[文字列2]/g test.txt
・文字列が含まれる行を削除
こちらは文字列自体ではなく、行自体を削除する。
文字列のみを削除したい場合には、sコマンドで空白を指定する。
sed /hello/d test.txt
・行番号を指定して削除
削除の方法には特定文字列で指定するほかに、番号で指定して削除する方法もあります。
下記の書き方で[番号1]行目から[番号2]行目まで削除する。
個別指定ではなくて範囲指定になるのでそこだけちょっと注意かも。
sed [番号1],[番号2]d test.txt
・複数文字の置換
複数文字の置換にはyコマンドを使用します。
知らなかったけど、試験的には出る可能性はありそう。
以下の例では、文字1を文字3に、文字2を文字4に置換する。
sed y/[文字1][文字2]/[文字3][文字4]/ test.txt
・前回(第十三回)
www.wantanblog.com
・次回(第十五回)
www.wantanblog.com