正則
- 正則就是一串有規律的字符串,掌握好正則對於編寫shell腳本有很大幫助,各類編程語言中都有正則,原理是同樣的
- 正則三劍客
grep
- grep用法
- grep [-cinvABC] 'word' filename
- -c 行數
- -i 不區分大小寫
- -n 顯示行號
- -v 取反
- -r 遍歷全部子目錄
- -A 後面跟數字,過濾出符合要求的行以及下面n行
- -B 同上,過濾出符合要求的行以及上面n行
- -C 同上,同時過濾出符合要求的行以及上下各n行
- 輸出結果:
[root@test01 jiaoben]# grep -n 'root' 1.log
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@test01 jiaoben]# grep -nv 'nologin' 1.log
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
[root@test01 jiaoben]# grep -nv '[0-9]' 1.log
[root@test01 jiaoben]# grep -nv '[1,2]' 1.log
1:root:x:0:0:root:/root:/bin/bash
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
13:nobody:x:99:99:Nobody:/:/sbin/nologin
16:polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20:ntp:x:38:38::/etc/ntp:/sbin/nologin
23:nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@test01 jiaoben]# grep -v '^#' 2.log|grep -v '^$'
asdfadfafasdfas
dfadffffffffffff#
[root@test01 jiaoben]# egrep -v '^#|^$' 2.log
asdfadfafasdfas
dfadffffffffffff#
- 能夠看到grep -v '^#' 2.log|grep -v '^$'就等於egrep -v '^#|^$' 2.log
[root@test01 jiaoben]# grep '^[a-zA-Z]' 2.log
asdfadfafasdfas
dfadffffffffffff#
[root@test01 jiaoben]# grep '^[^a-zA-Z]' 2.log
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
- ^ x: 表示已x開頭的行。^[a-zA-Z]表示已任意字母開頭的行。
- . 表示任意一個字符
- * 表示任意個數的字符,或者任意字符
- .*是通配,表示任意字符。
- grep 'o\{2\}' /etc/passwd== egrep 'o{2}' /etc/passwd 使用grep,當出現函數時須要脫義,寫法較繁瑣,能夠使用egrep來替代。
- + 表示有1個以上前面的字符
- ?表示有任意個?前面的字符
- '(oo){2}'這個寫法,匹配的是2個oo 也就是oooo.
- 'root|nologin'這個寫法是表示匹配root或者匹配nologin的行。
sed
- sed:stream editor文本流編輯,sed是一個非交互式的面向字符流的編輯器。能同時處理多個文件多行的內容,能夠不修改源文件,只將匹配的文件內容輸出到屏幕上。還能夠對文件作修改。
sed的命令語法格式:
- sed的命令格式:
sed [option] 'sed command'filename
- sed的腳本格式:
sed [option] -f 'sed script'filename
sed經常使用的參數
- -n:將匹配的行輸出到屏幕上。
- -e:能夠使用這個參數來增長匹配條件。
- -r:支持擴展表達式
- -i:將內容直接寫入文件(修改文件內容)。
實例:
- -n選項
[root@test01 jiaoben]# sed -n '5'p 1.log ##第5行內容輸出到屏幕
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@test01 jiaoben]# sed -n '1,5'p 1.log ##將1-5行內容輸出到屏幕
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@test01 jiaoben]# sed -n '22,$'p 1.log ##將20行到尾行內容輸出到屏幕
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/sbin/nologin
[root@test01 jiaoben]# sed -n '/root/'p 1.log ##將含有root的行輸出到屏幕
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@test01 jiaoben]# sed -n '/^root/'p 1.log ##將以root開頭的行輸出到屏幕
root:x:0:0:root:/root:/bin/bash
[root@test01 jiaoben]# sed -n '/var\/lib\/nginx:\/sbin\/nologin$/'p 1.log
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
## 將以var/lib/nginx:/sbin/nologin結尾的行輸出到屏幕,這裏用到了脫義符號\,若是不脫義就會報錯。
[root@test01 jiaoben]# sed -n '/r..o/'p 1.log ##匹配ro之間有兩個任意字符的行,輸出到屏幕
operator:x:11:0:operator:/root:/sbin/nologin # 這一行中operator,r和o之間有at,匹配成功
polkitd:x:999:998:User for polkitd:/:/sbin/nologin #這一行中有for polkitd ,r和o之間有空格和p,匹配成功
- -e選項
[root@test01 jiaoben]# sed -e '1'p -e '/1000/'p -n 1.log ##將第一行和含有1000字符的行輸出到屏幕。
root:x:0:0:root:/root:/bin/bash
mysql:x:1000:1000::/home/mysql:/sbin/nologin
- -d選項
[root@test01 jiaoben]# sed '1,22'd 1.log ##刪除1-22行 (不會修改文件,只是輸出結果不顯示1-22行)
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/sbin/nologin
[root@test01 jiaoben]# sed '/oot/'d 1.log ##刪除匹配oot字符的行(不會修改文件)
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- 替換功能
[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed '1,2s/ot/to/g' 1.log ##將第一行第二行內容中的to字符改成ot字符
roto:x:0:0:roto:/roto:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed 's#ot#to#g' 1.log ## 這個寫法就是用#代替了/。
roto:x:0:0:roto:/roto:/bin/bash
[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed 's/[0-9]//g' 1.log ##將數字都刪掉
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed 's/[a-zA-Z]//g' 1.log ##將字母都刪掉
::0:0::/://
::1:1::/://
::2:2::/://
[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed -r 's/(root)(.*)(bash)/\3\2\1/' 1.log
bash:x:0:0:root:/root:/bin/root ##將每行的第一段和第三段調換位置