Shellスクリプト——正規表現

18898 ワード

正規表現の概念
正規表現:単一の文字列を使用して、ある文法規則に合致する一連の文字列を記述し、一致させる.通常は、php、python、sheなどのスクリプトプログラミング、テキストエディタで使用され、regex、regexpと略記され、モードに合致するテキストを取得、置換するために使用される.強力なテキストマッチング機能により、テキストの海洋で本明細書を迅速かつ効率的に処理できます.
基本正規表現
正規表現の文字列表現方法は、厳密さと機能によって基本正規表現と拡張正規表現に分けられます.基本正規表現は、一般的に使用される正規表現の最も基本的な部分です.Linuxシステムで一般的なファイル処理ツールではgrepとsedがベース正規表現をサポートし、egrepとawkは拡張正規表現をサポートします.
メタ文字のまとめ
$               。      RegExp     Multiline   , “$”   ‘
’ ‘\r’。 “$” , “\$” . “\r
” \ 、 、 、 。 ,‘n’ “n”。 ‘
’ 。 ‘\\’ “\”, ‘\(’ “(” * 。 “*” , “\*” [] 。 。 ,“[abc]” “plain” “a” [^] 。 。 ,“[^abc]” “plain” “plin” [n1-n2] 。 。 ,“[a-z]” “a” “z” 。 : (-) , , ; , {n} n , n 。 ,“o{2}” “Bob” “o”, “food” o {n,} n , n 。 ,“o{2,}” “Bob” “o”, “foooood” o。“o{1,}” “o+”。“o{0,}” “o*” {n,m} m n , n<=m, n m

Linuxテキスト処理ツール
grep(フィルタリング、正規表現はサポートされていません)egrep(正規表現はサポートされています)sed(行フィルタリング)awk(列フィルタリング)
実際の操作のデモ
まず、操作に必要なテストファイルをtestとして作成し、名前を付けます.txtファイルの内容は以下の通りです.

1)、
, test.txt “god” 。 “-n” 、“-i” 。 , ,

[root@localhost ~]# grep -n 'god' test.txt  //  txt    'god'        
8:god
16:abcgo
[root@localhost ~]# 
[root@localhost ~]# grep -in 'god' test.txt //                'god'       
8:god
15:God
16:abcgod

2)、 “[]”

[root@localhost ~]# grep -n 'go[bc]l' test.txt 
12:gobl
13:gocl

[root@localhost ~]# grep -n 'oo' test.txt 
9:good
10:goooood

“[^]”

[root@localhost ~]# grep -n '[^g]oo' test.txt //    “g”       “oo”   
2:loood
3:lood

“oo” , “grep –n‘[^a-z]oo’test.txt” , “a-z” , “A-Z” 。

[root@localhost ~]# grep -n '[^a-z]oo' test.txt 
5:Goood
6:Good
[root@localhost ~]# grep -n '[^A-Z]oo' test.txt 
2:loood
3:lood
4:good

“grep –n‘[0-9]’test.txt”

[root@localhost ~]# grep -n '[0-9]' test.txt 
10:abc12345
12:12345

3)、 “^” “$”

[root@localhost ~]# grep -n '^g' test.txt   //   “g”      
1:gd
4:good
7:gola
8:gobl
9:gocl
[root@localhost ~]# grep -n 'l$' test.txt    //   “l”     
8:gobl
9:gocl
**                 '^[a-z]'     ,             “^[A-Z]”  ,              “^[^a-zA-Z]”  。**
[root@localhost ~]# grep -n '^[a-z]' test.txt  //             
1:gd
2:loood
3:lood
4:good
7:gola
8:gobl
9:gocl
10:abc12345
[root@localhost ~]# grep -n '^[A-Z]' test.txt //             
5:Goood
6:Good
11:God
[root@localhost ~]# grep -n '^[^a-zA-Z]' test.txt //          
12:12345

(.) 。 (.) , “\” 。

[root@localhost ~]# grep -n '\.$' test.txt 
abc12345.
God.
12345.

, “grep –n‘^$’test.txt”

[root@localhost ~]# grep -n '^$' test.txt 
15:

*4)、 “.” “”, , “g??l” , , g l 。**

[root@localhost ~]# grep -n 'g..l' test.txt 
8:gobl
9:gocl

oo、ooo、ooooo , () 。 ,“” 。“o” ( ) “o” , , “grep –n‘o’test.txt” 。 “oo”, o , o o, o、oo、ooo、ooo, 。 , o , “grep –n‘ooo’ test.txt” 。

[root@localhost ~]# grep -n 'ooo*' test.txt 
2:loood
3:lood
4:good
5:Goood
6:Good

g l , o ,

[root@localhost ~]# grep -n 'goo*d' test.txt 
4:good
5:gooood
6:goood

g d ,

[root@localhost ~]# grep -n 'g.*d' test.txt 
1:gd
4:good
5:gooood
6:goood

[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt 
12:abc12345.
14:12345.

5) “{}”
“.” “*” ,“{}” Shell , “{}” , “\”, “{}” 。
(1) o

[root@localhost ~]# grep -n 'o\{2\}' test.txt 
2:loood
3:lood
4:good
5:gooood
6:goood
7:Goood
8:Good

(2) g l , 2~5 o

[root@localhost ~]# grep -n 'go\{2,5\}d' test.txt 
4:good
5:goooood
6:goood

(3) w d , 2 o

[root@localhost ~]# grep -n 'go\{2,\}d' test.txt 
4:good
5:goooood
6:goood

egrep , , , 、 、 。

+     :                

  :  “egrep -n 'wo+d' test.txt”  ,    "wood" "woood" "woooooood"    
?     :            

  :  “egrep -n 'bes?t' test.txt”  ,    “bet”“best”      
|     :    (or)         

  :  “egrep -n 'of|is|on' test.txt”      "of"  "if"  "on"   
()    :  “ ”   
  :“egrep -n 't(a|e)st' test.txt”。“tast” “test”        “t” “st”    ,   “a” “e”  “()”    ,  “|”  ,    "tast"  "test"   
()+   :        

  :“egrep -n 'A(xyz)+C' test.txt”。         "A"   "C",         "xyz"      

[root@localhost ~]# egrep -n 'go+d' test.txt 
4:good
5:goooood
6:goood

[root@localhost ~]# egrep -n 'go?d' test.txt 
1:gd

(or)

[root@localhost ~]# egrep -n 'ol|ob' test.txt 
9:gola
10:gobl

“ ”

[root@localhost ~]# egrep -n 'go(b|c)l' test.txt 
10:gobl
11:gocl

[root@localhost ~]# egrep -n 'g(abc)+d' test.txt 
2:gabcd
3:gabcabcd

sed

sed , , ( 、 、 、 ), 。sed , Shell , 。
sed 、 。
:sed ( 、 、 )

( ,pattern space)。
: , sed , , sed 。
: 。 , 。
, , 。

1. sed
sed , 。 ,“ ” , , “,” ; scriptfile , “-f” , , 。
sed
sed[ ] ' '
sed [ ] -f scriptfile

sed 。
-e --expression=: 。
-f --file=: 。
-h --help: 。
-n、--quiet silent: 。
-i: 。

, 。
a: , 。
c: , 。
d: , 。
i: , 。

p: , , ; , ; , ASCII 。 “-n” 。
s: , 。
y: 。

(p )

[root@localhost ~]# sed -n 'p' test.txt   //      
godg
gabcd
gabcabcd
.....//      
abc12345.
God.
12345.
[root@localhost ~]# sed -n '3p' test.txt  //   3   
gabcabcd
[root@localhost ~]# sed -n '3,5p' test.txt   //  3~5   
gabcabcd
good
goooood
[root@localhost ~]# sed -n 'p;n' test.txt   //        
godg
gabcabcd
goooood
Goood
gola
gocl
God.
[root@localhost ~]# sed -n 'n;p' test.txt  //        
gabcd
good
goood
Good
gobl
abc12345.
12345.
[root@localhost ~]# sed -n '1,5{p;n}' test.txt   //  1~5     
godg
gabcabcd
goooood
[root@localhost ~]# sed -n '10,${n;p}' test.txt  //   10      
gocl
God.

sed ,sed , , “/” 。 sed 。

[root@localhost ~]# sed -n '/goo/p' test.txt  //    "goo"   
good
goooood
goood
[root@localhost ~]# sed -n '4,/go/p' test.txt   //  
good
goooood
[root@localhost ~]# sed -n '/go/=' test.txt   //    "go"      
1
4
5
6
9
10
11
[root@localhost ~]# sed -n '/^G/=' test.txt   //   "G"      
7
8
13
[root@localhost ~]# sed -n '/\/p' test.txt   //      "good"   
good

2) (d)

[root@localhost ~]# nl test.txt | sed '3d'  //      
     1  godg
     2  gabcd
     4  good
     5  goooood
     6  goood
     7  Goood
[root@localhost ~]# nl test.txt | sed '3,5d' //   3   5 
     1  godg
     2  gabcd
     6  goood
     7  Goood
     8  Good
     9  gola
[root@localhost ~]# nl test.txt | sed '/good/d '   //  "good"    
     1  godg
     2  gabcd
     3  gabcabcd
     5  goooood
     6  goood
     7  Goood
[root@localhost ~]# sed '/^[a-z]/d' test.txt   //          
Goood
Good
God.
12345.
[root@localhost ~]# sed '/\.$/d' test.txt   //   "."      
godg
gabcd
gabcabcd
good
goooood
goood
Goood
Good
gola
gobl
gocl
[root@localhost ~]# sed '/^$/d' test.txt   //    
godg
gabcd
gabcabcd
good
goooood
goood
Goood
Good
gola
gobl
gocl
abc12345.
God.
12345.

3)

sed 's/the/THE/' test.txt   //        the     THE 
sed 's/l/L/2' test.txt  //       3  l    L 
sed 's/the/THE/g' test.txt  //       the    THE
sed 's/o//g' test.txt   //       o   (     )
sed 's/^/#/' test.txt   //       # 
sed '/the/s/^/#/' test.txt      //   the        # 
sed 's/$/EOF/' test.txt     //          EOF 
sed '3,5s/the/THE/g' test.txt   //   3~5      the     THE
sed '/the/s/o/O/g' test.txt //   the       o      O

4)

sed '/the/{H;d};$G' test.txt    //   the          ,{;}      
sed '1,5{H;d};17G' test.txt //   1~5         17   
sed '/the/w out.file' test.txt  //   the        out.file
sed '/the/r /etc/hostname' test.txt //   /etc/hostname       
//  the      
sed '3aNew' test.txt        //   3         ,    New 
sed '/the/aNew' test.txt    //   the           ,    New
sed '3aNew1
New2' test.txt // 3 ,

5)

[root@localhost ~]# sed '1,5{H;d};7G' test.txt   // 1~5           
goood
Goood

godg
gabcd
gabcabcd
good
goooood
Good
gola
gobl
gocl
abc12345.
God.
12345.
[root@localhost ~]# vim local_only_ftp.sh #!/bin/bash
#         、      
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf " 
CONFIG="/etc/vsftpd/vsftpd.conf"
#          ,      /etc/vsftpd/vsftpd.conf.bak         ,         cp          
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak #           ,      
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
#   vsftpd   ,          
 systemctl restart vsftpd
systemctl enable vsftpd

awk

Linux/UNIX ,awk , , , , , Shell , 。
1. awk
awk , , “{}” 。awk , “-f” 。

awk    '      {    }'    1    2 „   //             
awk -f         1    2 „ //          ,       

/etc/passwd 、 ID、 ID , awk

[root@localhost ~]# awk -F ':' '{print $1,$3,$5}' /etc/passwd
root 0 root
bin 1 bin
daemon 2 daemon
....//    
awk            (    )    :
    FS:            ,         。

    NF:           。
    NR:         (  )。
    $0:           。
    $n:        n    (  n  )。
    FILENAME:       。
    RS:      ,   
, 。

  1. 1)
awk '{print}' test.txt       //      ,    cat test.txt
awk '{print $0}' test.txt   //      ,    cat test.txt
awk 'NR==1,NR==3{print}' test.txt   //    1~3    
awk '(NR>=1)&&(NR<=3){print}' test.txt  //    1~3    
awk 'NR==1||NR==3{print}' test.txt  //    1  、  3    
awk '(NR%2)==1{print}' test.txt //          
awk '(NR%2)==0{print}' test.txt //          
awk '/^root/{print}' /etc/passwd    //   root     
awk '/nologin$/{print}' /etc/passwd//    nologin     
awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END {print x}' /etc/passwd
//   /bin/bash      ,    grep -c "/bin/bash$" /etc/passwd 
awk 'BEGIN{RS=""};END{print NR}' /etc/squid/squid.conf
//             

2)

awk '{print $3}' test.txt   //     (         )   3    
awk '{print $1,$3}' test.txt    //        1、3    
awk -F ":" '$2==""{print}' /etc/shadow //          shadow   
awk 'BEGIN {FS=":"}; $2==""{print}' /etc/shadow
//          shadow   
awk -F ":" '$7~"/bash"{print $1}' /etc/passwd  //          7       /bash      1    
awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services  //     8       1        nfs      1、2    
awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}'
/etc/passwd
//    7       /bin/bash    /sbin/nologin     

3) 、 Shell

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd  //  wc -l       bash      ,    grep -c "bash$" /etc/passwd 
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}' //  w   ,          
awk 'BEGIN { "hostname" | getline ; print $0}'   //  hostname,         

sort

Linux , :sort、uniq、wc 。 。
sort , 。 。sort “sort [ ] ”, 。
-f: ;
-b: ;
-M: ;
-n: ;
-r: ;
-u: uniq, ;
-t: , [Tab] ;
-o : ;
-k: 。

[root@localhost ~]# sort /etc/passwd  //        /etc/passwd/      
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
akg:x:1000:1000:akg:/home/akg:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
..//      
wangwu:x:1003:1003::/home/wangwu:/bin/bash
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
zhangsna:x:1027:1027::/home/zhangsna:/bin/bash
zhaoliu:x:1004:1004::/home/zhaoliu:/bin/bash
[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd  // /etc/passwd             
nobody:x:99:99:Nobody:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
..//      
wangwu:x:1003:1003::/home/wangwu:/bin/bash
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
akg:x:1000:1000:akg:/home/akg:/bin/bash
root:x:0:0:root:/root:/bin/bash

/etc/passwd , user.txt

[root@localhost ~]# sort -t ':' -k 3 /etc/passwd -o user.txt
[root@localhost ~]# cat user.txt 
root:x:0:0:root:/root:/bin/bash
akg:x:1000:1000:akg:/home/akg:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
wangwu:x:1003:1003::/home/wangwu:/bin/bash
zhaoliu:x:1004:1004::/home/zhaoliu:/bin/bash
..//      
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

uniq

Uniq Linux sort , 。 :uniq [ ] 。 。
-c: ;
-d: ;

-u:         ;

testfile

[root@localhost ~]# cat test.txt  //           
godg
gabcd
gabcabcd
goooood
goood
Goood
good
good
good
good
[root@localhost ~]# uniq test.txt   //            
godg
gabcd
gabcabcd
goooood
goood
Goood
good
Good

testfile ,

[root@localhost ~]# uniq -c test.txt 
      1 godg
      1 gabcd
      1 gabcabcd
      1 goooood
      1 goood
      1 Goood
      4 good

testfile

[root@localhost ~]# uniq -d test.txt 
good