Shellスクリプト——正規表現
正規表現:単一の文字列を使用して、ある文法規則に合致する一連の文字列を記述し、一致させる.通常は、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)
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