正規表現について

正規表現について

とりあえず
/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 

とする

書く順番が
行頭を探すのなら
^探したい文字
となり

行末を探すのなら
探したい文字$
というように書くようになる

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です