はじめに
Linuxのgrep,sedコマンドとそれに関連する正規表現について初歩的なことを学んだので,それをまとめる.
grepコマンド
- 指定したファイルから文字列を検索するコマンド
- 検索一致した行全体を表示する
書式:grep [オプション] 検索対象文字列 ファイル名
オプションの紹介
-
-i
: 大文字小文字を区別せず検索 -
-n
: 検索一致した行番号も表示 -
-v
: 検索一致しなかった行を表示
sedコマンド
- ファイル内の文字列置換や特定の項目の表示などの操作を行うためのコマンド
- sedは「Stream Editor」の略であり,非対話型エディタ
- 指定したファイルをコマンドに従って操作して標準出力する
対話型エディタと非対話型エディタについて
-
非対話型エディタの実行手順
1. シャルから編集コマンドを引数として与えて,sedコマンド実行
2. sedコマンドは編集対象のテキストに対して,与えられた編集コマンドに対応する編集操作を行う
3. 編集後のテキストを,sedコマンドが標準出力に出力 -
対話型エディタの実行手順
1. エディタを開き,バッファ内で編集
2. 編集終了後,ファイルに保存
基本書式: sed スクリプト 対象ファイル
sed 1d file
◆スクリプトの書式について
- 例1. アドレス+コマンド(ex.
1d
→1
がアドレス,d
がコマンド) - 例2. コマンド+引数+フラグ(ex.
's/aa/bb/g'
→s
がコマンド,/aa/bb/
が引数,g
がプラグ)
◆コマンドの種類
-
d
: 行を削除するコマンド -
p
: 行を表示するコマンド -
s
: 行を置換するコマンド(ex.sed 's/置換前文字列/置換後文字列/フラグ' file
: フラグは省略可能 )
# 1行目を削除
sed 1d text.txt
# 「りんご」を「apple」に置換して標準出力
sed 's/りんご/apple/p' text.txt
◆アドレスの指定について
アドレスを指定することはファイル内の行を指定するようなもの.
アドレスの指定には,m,n
で「m行~n行まで」の範囲を指定できる.また,$
で最終行を指定できる.(ex.sed 1,5d file
: 1行目から5行目まで削除)
なお,正規表現でアドレスの指定ができる.その際にはスラッシュで囲む.
◆pコマンド実行時のパターンスペースの自動出力について
sed 1p file を入力すると,以下のように1行目が2回出力される.
1行目表示
1行目表示
2行目表示
3行目表示
・・・略・・・
これはパターンスペースが自動出力されているのが原因.sedコマンドが行を読み込むとパターンスペースという場所にいったんコピーする.その後,編集コマンドをパターンスペースに実行してからパターンの内容を出力する.以下,そのフロー.
$ sed 1p file
- 1行目を読み込んでパターンスペースにコピー
- 「1p」コマンドを実行し,1行目を出力
- パターンスペースを出力
- 次の行を読み込んでパターンスペースにコピーして出力
- 4の繰り返し
◆置換時の区切り文字の変更
sコマンドによって,「/(スラッシュ)」自体の置換を行う際は,「\」(注1)を付けてエスケープする(/と記述).
(注1).区切り文字は「/」に限定されているわけではない.「?」,「!」でも区切り文字としては使用できる.これはsコマンドの直後の文字が区切り文字として認識されるため,どんな文字でもかまわない.
正規表現
- 通常の文字列表記を使用せず検索を行うときに利用される文字列表現
- 正規表現とは,条件に合致する文字列集合を表現するための記法
- 通常,正規表現の部分はシングルクォートで囲んで指定する
基本正規表現の種類(よく使われそうなもの)
-
.
: 任意の1文字にマッチ -
^
: 行の先頭を意味する(ex.^etc
→行の先頭が「etc」であるという意味) -
$
: 行末を意味する(ex.jp$
→行の末尾が「jp」であるという意味) -
\
: 直後のメタ文字を打ち消す(ex.\.
→.(ドット) そのものを意味する) -
[]
: []の中に含まれる,いずれかの一文字 -
[^ ]
:[ ]の中に含まれない,いずれかの1文字 -
*
: 直前の文字が0回以上の繰り返しを表現(ex.ca*r
→cr,car,caar,caaaar,...などを表現)
拡張正規表現
-
+
: 直前の文字の1回以上の繰り返しを意味する -
?
: 0回または1回の繰り返しを意味する -
{m,n}
: {}というメタ文字の利用.m回以上,n回以下の繰り返しを意味する
所感
grep,sedコマンドにはここで取り上げた以外のオプションやコマンドが予想以上に存在していることに驚いた.正規表現とコマンド操作はまだまだ未熟であるから早く慣れたい.
参考文献
新しいLinuxの教科書