Linuxコマンドを勉強~grep、正規表現、sed~

grep

grepコマンドは、ファイル内の文字列を検索するコマンドです。

書式とオプションをまず紹介します。

パターンとは、正規表現のことです。正規表現とは、記号や文字を組み合わせて文字列の集合を簡単に表現したものです。
正規表現についてはこの後やるので、まずは検索したい文字列という認識で構いません。

-v パターンに一致しない行を表示する。
-n パターンに一致した行を行番号付きで表示する。
-l パターンに一致した文字列を含んだファイル名を表示する。
-i 大文字小文字の区別をしないで検索する。

moreコマンドのマニュアルをコピーしたa.txtを用意しました。
このマニュアルのなかで、”more”という文字列が使われている行を検索します。

このように、行全体を表示します。行番号を表示してみます。

となります。

ファイル名やディレクトリ名を検索することもできます。

「ls -R」と組み合わせて、ホームディレクトリ以下に”test”と付くファイルかディレクトリがないか検索してみました。
このようにgrepは、様々なコマンドとパイプでつなげてそのコマンドの出力結果から望む行を検索して表示するのに利用されます。

正規表現

grepのパターンには、正規表現が使用できます。
正規表現は以前勉強したワイルドカードとは違いますが、やりたいことは同じです。

ワイルドカード同様、特別な文字を用意しています。これをメタキャラクタといいます。

. 任意の1文字 grep ‘.’ → a 1 _ ! など文字すべて
* 直前の文字の0回以上の繰り返しに一致 grep ‘a*’ → a aa aaaaa… などaの繰り返し。
grep ‘.*’ →すべての文字列
[] 囲んだ文字のどれかに一致 grep ‘[ad]’ → aかdを含む行
[^] 囲んだ文字のどれにも一致しない grep ‘[^ad]’ → aとdを含まない行
^ 行頭 grep ‘^a.*’ → aから始まる行
$ 行末 grep ‘.*a$’ → aで終わる行

注意するのは”^”です。これが”[]”の中で使われると、囲まれた文字グループに一致しない、という条件になります。行頭の意味ではなくなります。

また、”.”を文字列として検索したい場合は、”\”(バックスラッシュ)を付けます。”\”(バックスラッシュ)を付けたメタキャラクタはただの文字扱いになります。(もちろん”\”(バックスラッシュ)自身も”\\”とすることで文字扱いになります。)

fgrepコマンドを使うと、正規表現を使わず、ただの文字列としてパターンを検索します。
「fgrep ‘***’」などとすると、バックスラッシュなしで”***”という文字列を検索します。

・・・正規表現はもう例を見て試していくしかないんでしょうね。

ディレクトリ内を再帰的に検索する”-r”オプションもあるのですが、
これは後々追加されたオプションですので、使えないOSもあると思います。

・・・一応、覚えておこう・・・。

sed

sedコマンドは、文字列の置換や、行の削除などを行います。
書式はこうなっています。

オプションは以下となります。

-e 指定した変換スクリプトで文字列の置換を行います。
-f 指定したスクリプトファイルの内容で文字列の置換を行います。
-n 変換対象の行のみを表示します。
-i 変換の結果を画面に表示せず直接ファイルを上書き更新します。

オプションを省略すると、”-e”オプションを付けたことと同様になります。
また、-iオプションに拡張子をつけると、その拡張子を付けてバックアップファイルを取ってくれます。(例. sed -i.bak -e …)

変換スクリプトは操作によって書式を覚えたほうがいいと思います。

最初に検索された文字列の置換 s/パターン/置換したい文字列/
ファイル内の文字列を全部置換 s/パターン/置換したい文字列/g
n番目に検索された文字列の置換 s/パターン/置換したい文字列/数字
パターンを含む行の削除 パターン d
n行目の削除 数字 d
パターンを含む行の表示 パターン p
n行目の表示 数字 p
パターンを含む行の上に文字列を挿入 /パターン/i 挿入する文字列
パターンを含む行の下に文字列を追加 /パターン/a 追加する文字列

次のような内容のファイルがあったとして、”c”という文字を”z”に換えます。

このように最初の”c”だけが置換されます。

2番目の”c”だけを置換しました。

“g”を指定すると、すべての”c”が置換されます。

次に、下のようなスクリプトファイルを用意します。
a.script:
s/c/z/g
s/a/y/g

ファイル内の”c”を”z”に、”a”を”y”に置換します。
このスクリプトファイルを使ってsedを実行してみます。

このように、スクリプトファイルに書かれた変換スクリプトをすべて実行します。

駆け足で正規表現終了。

広告
  • LINEで送る