正規表現について
とりあえず
/etc/service を検索する
この中から
80/tcp
80/udp
を調べる
1 | grep '80/.p' /etc/services |
これだといろいろとでてくる
理由は
. が正規表現の意味では
なんでもいいから1文字ってことだから
なので
1 | grep '80/..p' /etc/services |
を実行すると
80のあとに何か2文字あり
そのあとにpがあること
という意味になる
. が2つなら2文字という意味
次は、ちょっと描き方を変えて検索する
1 | 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
と指定しているので
ここから検索している
この[]をブラケットという
これを使えば、ポート番号を指定して検索できる
1 | grep '[2-8]000/tcp' /etc/services |
とすると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 |
というようにポート番号での検索が簡単になる
ちなみに [] の中で ^ を使うと否定の意味になる
これは ! とかと同じ意味になる
もし特定の番号以外を調べたいというのなら
1 | grep '[^2-8]000/tcp' /etc/services |
を実行すれば
1 2 3 4 5 6 7 8 | 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 という行を探すのなら
1 | grep '00*/tcp' /etc/services |
を実行する
ちなみに
*は0回以上の繰り返しという意味なので
1 | grep '0*/tcp' /etc/services |
だと意味が変わってしまう
これを利用して数理が4つのあと /tcp
となっている行を探すのなら
1 | grep '[0-9][0-9][0-9][0-9]*/tcp' grep /etc/services |
とすればいい
でも通常はこんな面倒な書き方はせず
grep -E で拡張正規表現を使う
5桁の数字のあとに /tcp とかいてある行なら
1 | grep -E '[0-9]{5}/tcp' /etc/services |
とすればいい
{} の中に繰り返す回数を書けばオK
HTML の emmet で li*5 とかいて
li が5つというようなかんじ
次に ^ だけど
{} 以外では先頭という意味になる
vim とかで先頭の文字を指定して検索するときにも使える
Linux のシステムファイルは
#でコメントアウトしているので
試しにコメントアウトされている行を検索するのなら
grep ‘^#’ /etc/services
とすれば
先頭が#で始まる行を調べることができる
逆に行末を調べたいのなら $ をつけて調べる
shが行末になっている部分を探すのなら
1 | grep 'sh$' /etc/services |
とする
書く順番が
行頭を探すのなら
^探したい文字
となり
行末を探すのなら
探したい文字$
というように書くようになる