LinuxServer シェルとコマンド操作について テキストファイル内の検索
テキストファイルの中身について、特定のキーワードで検索を掛け、結果を出力することも可能です。
特定のキーワードを検索するときには正規表現について理解しておくと検索がしやすくなります。
正規表現
正規表現(Regex:REGular EXpression)はある文字の並びを使って、より複雑な文字の並びを表現する方法です。
正規表現はメタキャラクタを使い、次の表の意味を持ちます。
メタキャラクタ | 説明 | 使用例 |
. | 任意の1文字を表します | n.t n1tやnat等、nで始まり、tで終わる3文字を表します |
* | 直前文字の0回以上の繰り返しを表します | .* 0文字以上の文字列を表します。 |
^ | 行頭を表します | ^n 行頭にnが来る文字列を表します |
$ | 行末を表します | n$ nで終わる(行末にnが来る)文字列を表します |
[] | []内の任意の1文字を表します(候補を指定します) -を付けることで文字列の範囲を指定し、 先頭に^を置くことで指定した文字列を除きます |
[a-Z],[a-z],[0-9]はそれぞれ任意のアルファベット、小文字、数字を表します |
直後に続く文字を通常の文字として処理します | * 文字列*を表します |
|
+ | 直前文字の1回以上の繰り返しを表します(拡張正規表現) | a+ aを1回以上繰り返す(a,aa,aaa)文字列を表します |
? | 直前文字の0回もしくは1回の繰り返しを表します(拡張正規表現) | ssh? hが0文字または1文字(ssh,sshh)を表します |
| | 左右いずれかの文字列を表します(拡張正規表現) | ssh|telnet sshまたはtelnetを表します |
正規表現はgrepコマンドや、sedコマンドで使用可能です。
grepコマンド
grepコマンドは正規表現を用いて、テキストストリームやファイルの中に、特定の文字列を含む行を抽出します。
[コマンド書式]
grep -オプション 正規表現(検索文字列)ファイル名
主なオプションは次のとおりです
オプション | 説明 |
-c | 検索文字列にマッチした行数を表示します |
-f | 検索文字列をファイルから読み込みます |
-i | 検索文字列の大文字と小文字を区別しません |
-n | 検索結果に行番号を付与します |
-v | 検索文字列にマッチしない行を表示します |
-E | 拡張正規表現を使用して検索します |
-F | 検索文字列を正規表現ではなく文字列とします |
[コマンド実行例]
$ cat grepfile.txt
eee,1511,AAA
ccc,1211,BBB
fff,1311,CCC
ggg,1411,DDD
aaa,1111,EEE
bbb,1611,FFF
.*.,1711,?_?
「a」にマッチする行を表示します
$ grep a grepfile.txt
aaa,1111,EEE
「aA」にマッチする行を表示します(大文字と小文字を区別しません)
$ grep -i a grepfile.txt
eee,1511,AAA
aaa,1111,EEE
「a」にマッチしない行を表示します。
$ grep -v a grepfile.txt
eee,1511,AAA
ccc,1211,BBB
fff,1311,CCC
ggg,1411,DDD
bbb,1611,FFF
.*.,1711,?_?
拡張正規表現を使うには’-eオプション’をつけます。-Eオプションを付けるのは
‘egrep’コマンドを使用するのと同じになります。
「a」か「b」にマッチする行を表示
$ grep -E ‘a|b’ grepfile.txt
aaa,1111,EEE
bbb,1611,FFF
検索文字列を正規表現ではなく文字列として使うには’-Fオプション’をつけます。
-Fオプションを付けるのは’fgrep’コマンドを使用するのと同じになります。
「.」は任意の一文字なので、全ての行がマッチします。
$ grep . grepfile.txt
eee,1511,AAA
ccc,1211,BBB
fff,1311,CCC
ggg,1411,DDD
aaa,1111,EEE
bbb,1611,FFF
.*.,1711,?_?
「.」はドットと言う文字を検索するので「.」のある文字列がマッチします。
$ grep -F . grepfile.txt
.*.,1711,?_?