正規表現について
とりあえず
/etc/service を検索する
この中から
80/tcp
80/udp
を調べる
grep '80/.p' /etc/services
これだといろいろとでてくる
理由は
. が正規表現の意味では
なんでもいいから1文字ってことだから
なので
grep '80/..p' /etc/services
を実行すると
80のあとに何か2文字あり
そのあとにpがあること
という意味になる
. が2つなら2文字という意味
次は、ちょっと描き方を変えて検索する
grep '80/[tu][cd[]p' /etc/services
これだと
tcp
udp
に該当するものがでる
これは正規表現で
[] で囲むことで文字の指定をしているから
[tu]
だと
t か u
になる
これで最初の文字がt か u
で始まるものになる
次に2文字目が
[cd]
なんで、cか d が2文字目のもの
という意味になる
そして3文字目は p だけなので
条件を満たすのは
tcp
udp
のどちらかという意味になる
あとは検索先を /etc/service
と指定しているので
ここから検索している
この[]をブラケットという
これを使えば、ポート番号を指定して検索できる
grep '[2-8]000/tcp' /etc/services
とすると
sieve-filter 2000/tcp cisco-sccp # Sieve Mail Filter Daemon x11 6000/tcp X # the X Window System afs3-fileserver 7000/tcp # file server itself quake 26000/tcp hbci 3000/tcp # HBCI #remoteware-cl 3000/tcp # RemoteWare Client terabase 4000/tcp # Terabase commplex-main 5000/tcp # irdmi 8000/tcp # iRDMI entextxid 12000/tcp # IBM Enterprise Extender SNA XID Exchange scotty-ft 14000/tcp # SCOTTY High-Speed Filetransfer hydap 15000/tcp # Hypack Data Aquisition biimenu 18000/tcp # Beckman Instruments, Inc. snapenetio 22000/tcp # SNAPenetIO inovaport1 23000/tcp # Inova LightLink Server Type 1 med-ltp 24000/tcp # med-ltp icl-twobase1 25000/tcp # icl-twobase1 nxlmd 28000/tcp # NX License Manager mbus 47000/tcp # Message Bus
というようにポート番号での検索が簡単になる
ちなみに [] の中で ^ を使うと否定の意味になる
これは ! とかと同じ意味になる
もし特定の番号以外を調べたいというのなら
grep '[^2-8]000/tcp' /etc/services
を実行すれば
cadlock2 1000/tcp # cslistener 9000/tcp # CSlistener ndmp 10000/tcp # Network Data Management Protocol irisa 11000/tcp # IRISA igrid 19000/tcp # iGrid Server dnp 20000/tcp # DNP irtrans 21000/tcp # IRTrans Control safetynetp 40000/tcp # SafetyNET p
という結果になる
次に0が1回以上繰り返して
続く文字が
/tcp という行を探すのなら
grep '00*/tcp' /etc/services
を実行する
ちなみに
*は0回以上の繰り返しという意味なので
grep '0*/tcp' /etc/services
だと意味が変わってしまう
これを利用して数理が4つのあと /tcp
となっている行を探すのなら
grep '[0-9][0-9][0-9][0-9]*/tcp' grep /etc/services
とすればいい
でも通常はこんな面倒な書き方はせず
grep -E で拡張正規表現を使う
5桁の数字のあとに /tcp とかいてある行なら
grep -E '[0-9]{5}/tcp' /etc/services
とすればいい
{} の中に繰り返す回数を書けばオK
HTML の emmet で li*5 とかいて
li が5つというようなかんじ
次に ^ だけど
{} 以外では先頭という意味になる
vim とかで先頭の文字を指定して検索するときにも使える
Linux のシステムファイルは
#でコメントアウトしているので
試しにコメントアウトされている行を検索するのなら
grep ‘^#’ /etc/services
とすれば
先頭が#で始まる行を調べることができる
逆に行末を調べたいのなら $ をつけて調べる
shが行末になっている部分を探すのなら
grep 'sh$' /etc/services
とする
書く順番が
行頭を探すのなら
^探したい文字
となり
行末を探すのなら
探したい文字$
というように書くようになる