1. 程式人生 > >Shell腳本 (四)正則表達式 grep sed awk 工具

Shell腳本 (四)正則表達式 grep sed awk 工具

config 定義 情況 輸入 example 其他 bin 大小 share

正則表達式定義
正則表達式,又稱正規表達式、常規表達式
是使用單個字符串來描述、匹配一系列符合某個句法規則的字符串
·
正則表達式組成
普通字符
大小寫字母、數字、標點符號及一些其他符號
元字符
在正則表達式中具有特殊意義的專用字符
·
基礎正則表達式示例
查找特定字符
利用中括號[]來查找集合字符
查找行首^與行尾字符$
查找任意一個字符.與重復字符
查找連續字符範圍{}
·
基礎正則表達式的常見元字符
^、$、.、\、
、[ ]、[^ ]、[n1-n2]、{n}、{n,}、{n,m}
·
####查找特定字符####
n--表示顯示行號
i--表示不區分大小寫
v--表示反向選擇
·
grep -n ‘the‘ test.txt
grep -in ‘the‘ test.txt
grep -vn ‘the‘ test.txt
·
####利用中括號‘[]‘來查找集合字符
grep -n ‘sh[io]rt‘ test.txt ####找i或者是o的,只去其中一個
grep -n ‘oo‘ test.txt ####查找重復單個字符‘oo‘
grep -n ‘[^w]oo‘ test.txt ####查找‘oo‘前面不是‘w‘的字符串
grep -n ‘[^a-z]oo‘ test.txt ####查找oo前面不帶小寫字母的
grep -n ‘[0-9]‘ test.txt ####查找包含數字的
·
####查找‘^‘ 與行尾字符‘$‘
grep -n ‘^the‘ test.txt ####查找以the為行首的行
grep -n ‘^[a-z]‘ test.txt ####查找行首行以小寫字母開頭的
grep -n ‘^[^a-z]‘ test.txt ####查找行首行不以小寫字母開頭的
grep -n ‘^[A-Z]‘ test.txt ####查找首行以大寫字母開頭
grep -n ‘^[^a-zA-Z]‘ test.txt ####除了以大小寫字符開頭
grep -n ‘.$‘ test.txt ####這個點 . 因為是元字符,所以要轉義\
grep -n ‘^$‘ test.txt ####查找空白行
grep -n ‘ooo‘ test.txt #### 是元字符,但是這邊表示重復多個前面的字符。
grep -n ‘w.d‘ test.txt ####查詢以W開頭 d結尾,中間是任意字符
grep -n ‘[0-9][0-9]
‘ test.txt ####2個中括號,代表2位數,後面的*達標任意字符
·
#####查找連續字符範圍‘{}‘
grep -n ‘o{3}‘ test.txt ####查找連續3個o
grep -n ‘wo{2,5}d‘ test.txt ####查找以w開頭d結尾中間2個到5個o
grep -n ‘wo{2,}d‘ test.txt ####查找以w開頭d結尾中間2以上的o
·
#######sed工具########
是一個強大的而簡單的文本解析轉換工具,可以讀取文本、並根據制定指定的條件對文本內容進行編輯。
默認情況下,所有的sed的命令都是在模式空間內執行,因此輸入的文件並不會發生任何的變化,除非是用重定向存儲輸出。
·
sed [選項] ‘操作‘ 參數
常見選項
-e或者--expression= 表示用指定的命令或者腳本來處理輸入的文件文件
-f或則--file= 表示用指定的腳本文件來處理輸入的文本文件
-h或則--help 顯示幫助
-n 、--quite或則silent 表示僅顯示處理後的結果
-i 直接編輯文本文件
常見操作
a ####增加,在當前行下面增加一行指定的內容
c ####替換,將選定的行替換為指定內容
d ####刪除,刪除選定的行
i ####插入,在選定行上面插入一行指定的內容
p ####打印,如果同事指定行,表示打印指定行,如果不指定行,則表示打印所有內容
####如果有非打印字符的,則以ASCII碼輸出,通常與-n 選項一起使用
s ####替換,替換指定字符
y ####字符轉換
·
1.用法示例
sed -n ‘p‘ test.txt ####輸出所有的內容
sed -n ‘3p‘ test.txt ####輸出第三行
sed -n ‘3,5p‘ test.txt ####輸出第三行到第五行
sed -n ‘p;n‘ test.txt ####輸出所有奇數行
sed -n ‘n;p‘ test.txt ####輸出所有偶數行
sed -n ‘1,5{p;n}‘ test.txt ####輸出1-5的所有奇數行
sed -n ‘10,${n;p}‘ test.txt ####輸出第10行到末尾所有偶數行
sed -n ‘/the/p‘ test.txt ####輸出包含the的行
sed -n ‘4,/the/p‘ test.txt ####輸出從第4行至第一個包含the的行
sed -n ‘/the/=‘ test.txt ####輸出包含the坐在行的行號
sed -n ‘/^PI/p‘ test.txt #####輸出以PI開頭的行
sed -n ‘/\<wood\>/p‘ test.txt #####輸出包含單詞wood的行,\<\>代表單詞邊界
nl test.txt | sed ‘3d‘ #####刪除第3行,並不會改變原文件
nl test.txt | sed ‘3,5d‘ #####刪除第3行到第5行
nl test.txt | sed ‘/cross/d‘ #####刪除包含cross的行
nl test.txt | sed ‘/cross/!d‘ #####刪除不包含cross的行,用!表示取反操作
sed ‘/^[a-z]/d‘ test.txt #####刪除以小寫字符開頭的行
sed ‘/.$/d‘ test.txt #####刪除某行以.結尾的行
sed ‘/^$/d‘ test.txt #####刪除所有空行
·
2.替換符合條件的文本 ---需要用到s字符串替換、c(整行/整行替換)、y(字符轉換)
sed ‘s/the/THE/‘ test.txt ####將每行中的第一行的the替換為THE
sed ‘s/l/L/2‘ test.txt ####將每行的第2個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
·
3.遷移符合條件的文本 H--復制到剪切板 g G 將剪切板的數據覆蓋/追加至指定的行, w保存為文件,r為讀取指定文件 a追加指定內容
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\nNew2‘ test.txt #####在第3行後面插入多行內容,中間的內容表示換行
sed -i ‘$a\abc123‘ file.txt #####在文件的最後 插入abc123
·
4.使用腳本編輯文件
sed ‘1,5{H;d};17G‘ test.txt ###將第1行到第5行內用移至17,如果沒有17行則插不進去
[root@localhost opt]# vi opt.list ###編輯腳本
1,5H
1,5d
17G
[root@localhost opt]# sed -f opt.list test.txt ######用腳本對test.txt進行編輯
·
5.sed直接操作文件示例
[root@localhost opt]# vi /opt/Local_only_ftp.sh ####開啟FTP
#!/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 或者 sed -i ‘^listen/ssed -i ‘/^listen/s/NO/YES/g‘ /etc/vsftpd/vsftpd.conf
#啟動vsftpd服務器,並設為開機自動運行
systemctl restart vsftpd
systemctl enable vsftpd
####同上####
#!/bin/bash
a="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
b="/etc/vsftpd/vsftpd.conf"
[ ! -e "$b.bak" ] && cp $a $b.bak
sed -i ‘/^anonymous_enable/s/YES/NO/g‘ $b
sed -i ‘/^local_enable/s/NO/YES/g‘ $b
sed -i ‘/^write_enable/s/NO/YES/g‘ $b
sed -i ‘/^listen=/s/NO/YES/g‘ $b
systemctl restart vsftpd
systemctl enable vsftpd
·
##########AWK工具#########
1、AWK常見用法
awk 選項 ‘模式或條件{編輯指令}’ 文件1 文件2
awk -f 腳本文件 文件1 文件2
·
sed命令常用於一整行的處理,而AWK比較傾向於一行分成多個“字段”然後進行處理。
通常可以使用邏輯符號操作,“&&”,表示“與” “||”表示“或”,“!”表示“非”,還可以進行簡單的運算如
+- * / % ^ 分別表示加、減、乘、除、取余、乘方
·
[root@localhost opt]# awk -F ‘:‘ ‘{print $1,$3,$4}‘ /etc/passwd ###輸出/etc/passwd 裏面的賬戶、UID、GID
root 0 0
bin 1 1
daemon 2 2
adm 3 4
.....
·
AWK包含幾個特殊的內建變量(可以直接用)
FS----指定每行文本的字段分隔符,默認我空格或則制表位
NF----當前處理的行的字段個數
NR----當前處理的行的行號(序數)
$0----當前處理的行的整行內容
$n----當前處理行的第n個字段(第n列)
FILENAME----被處理的文件名
RS----數據記錄分割,默認\n,即每行為一條記錄
·
####用法實列####
awk ‘{print}‘ 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結尾的行數
awk ‘BEGIN {RS=""};END{print NR}‘ /etc/squid/squid.conf ####統計以空行分隔的段落數
awk ‘{print $3}‘ test.txt #####輸出每行中的第三個字段
awk ‘{print $1,$3}‘ test.txt #####輸出每行中的第1個和第3個字段
awk -F ":" ‘$2==""{print}‘ /etc/shadow ####輸出密碼為空的用戶
awk -F ":" ‘($7!="/bin/bash")&&($7!="/sbin/nologin"){print}‘ /etc/passwd #####輸出第7 個字段即不為/bin/bash 也不為/sbin/nologin的所有行

Shell腳本 (四)正則表達式 grep sed awk 工具