佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > shell腳本之正則表達(dá)式、grep、sed、awk

shell腳本之正則表達(dá)式、grep、sed、awk

熱門標(biāo)簽:阿里云 服務(wù)器配置 電子圍欄 Linux服務(wù)器 Mysql連接數(shù)設(shè)置 銀行業(yè)務(wù) 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 團(tuán)購(gòu)網(wǎng)站

--正則--

基礎(chǔ)正則

^word     ##搜索以word開(kāi)頭的 vi/vim中 ^ 一行的開(kāi)頭
word$     ##搜索以word結(jié)尾的 vi/vim中 $ 一行的結(jié)尾
^$        ##表示空行
.         ##代表且只能代表任意一個(gè)字符
\&;        ##例:\. 只代表點(diǎn)本身,轉(zhuǎn)義符號(hào),讓有特殊身份意義的字符,脫掉馬甲,還原
\n        ##換行符
\r        ##匹配回車
\w         ##匹配任意一個(gè)字符和數(shù)字
*         ##重復(fù)0次或多次前面的一個(gè)字符
.*        ##匹配所有字符。例:^.* 以任意多個(gè)字符開(kāi)頭,.*$以任意多個(gè)字符結(jié)尾
[abc]     ##匹配字符集內(nèi)的任意一個(gè)字符
[^abc]    ##匹配不包含 ^ 后的任意字符的內(nèi)容。中括號(hào)里的 ^ 為取反
[1-9]     ##表示匹配括號(hào)內(nèi)的范圍內(nèi)的任意字符
a\{n,m\}  ##重復(fù)n到m次前一個(gè)重復(fù)的字符。若用egrep、sed -r可以去掉斜線
\{n,\}    ##重復(fù)至少n 次前一個(gè)重復(fù)的字符。若用egrep、sed -r可以去掉斜線
\{n\}     ##重復(fù)n 次前一個(gè)重復(fù)的字符。若用egrep、sed -r可以去掉斜線
\{,m}\&;   ##重復(fù)少于m次

注:egrep,grep –E或sed –r 過(guò)濾一般特殊字符可以不轉(zhuǎn)義

擴(kuò)展正則(egrep或grep -E)

+          ##重復(fù)一次或一次以上前面的一個(gè)字符
?          ##重復(fù)0次或一次前面的一個(gè)字符
|          ##或者的意思,用或的方式查找多個(gè)符合的字符串
()         ##找出括號(hào)內(nèi)的字符串

^linux     ##以linux開(kāi)始
linux$     ##以linux結(jié)束
linuxfan.   ##匹配linuxfans等
coo[kl]    ##匹配cool或cook
9[^5689]    ##匹配91,92等,但不匹配95,96,98,99
[0-9]     ##匹配任意一個(gè)所有的數(shù)字
[a-z]|[A-Z]  ##匹配任意一個(gè)所有大小寫字母,|屬于擴(kuò)展正則grep -E支持
colou?r    ##匹配color或colour,但是不能匹配colouur
rollno-9+   ##匹配rollno-9、rollno-99,rollno-999,但不匹配rollno-
co*l      ##匹配cl,col,cool,coool等
ma(tri)x    ##匹配matrix
[0-9]{3}    ##匹配任意一個(gè)三位數(shù),等于[0-9][0-9][0-9]
[0-9]{2,}   ##匹配任意一個(gè)兩位數(shù)或更多位的數(shù)字
[0-9]{2,5}   ##匹配從兩位數(shù)到五位數(shù)之間的任意一個(gè)數(shù)字
Oct (1st|2nd) ##匹配Oct 1st或Oct 2nd
a\.b      ##匹配a.b,但不能匹配ajb
[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}       ##匹配一個(gè)郵箱地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ##匹配IP地址

--grep--

語(yǔ)法:grep [選項(xiàng)] [條件表達(dá)式] 目標(biāo)文件

cat /proc/meminfo |grep -e Mem -e Cache -e Swap     ##查看系統(tǒng)內(nèi)存、緩存、交換分區(qū)-e的作用是匹配多個(gè)表達(dá)式
grep -R -o -n -E  '[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}' /etc/     ##查找/etc目錄下的所有文件中的郵件地址;-R遞歸,-n表示匹配的行號(hào),-o只輸出匹配內(nèi)容,-E支持?jǐn)U展正則表達(dá)式,
grep -R -c 'HOSTNAME' /etc/ |grep -v "0$"     ##查找/etc/目錄下文件中包含“HOSTNAME”的次數(shù),-c統(tǒng)計(jì)匹配次數(shù),-v取反
grep -R -l 'HOSTNAME' /etc/           ##查找包含“HOSTNAME”的文件名,-l顯示匹配的文件名,-L顯示不匹配的文件名
dmesg | grep -n --color=auto 'eth'       ##查找內(nèi)核日志中eth的行,顯示顏色及行號(hào)
dmesg | grep -n -A3 -B2 --color=auto 'eth'     ##用 dmesg 列出核心信息,再以 grep 找出內(nèi)含 eth 那行,在關(guān)鍵字所在行的前兩行與后三行也一起找出出來(lái)顯示
cat /etc/passwd |grep -c bash$         ##統(tǒng)計(jì)系統(tǒng)中能登錄的用戶的個(gè)數(shù)
touch /tmp/{123,123123,456,1234567}.txt   ##創(chuàng)建測(cè)試文件,以下三條命令是一樣的效果,匹配文件名123,可以包含1個(gè)到多個(gè)
ls |grep -E '(123)+' 
ls |grep '\(123\)\+'
ls |egrep '(123)+'
ps -ef |grep -c httpd             ##統(tǒng)計(jì)httpd進(jìn)程數(shù)量
grep -C 4 'games' --color /etc/passwd       ##顯示games匹配的“-C”前后4行
grep ^adm /etc/group             ##查看adm組的信息
ip a |grep -E '^[0-9]' |awk -F : '{print $2}'     ##獲取網(wǎng)卡名稱
ifconfig eth0 |grep -E -o 'inet addr:[^ ]*' |grep -o '[0-9.]*'   ##截取ip地址,[^ ]*表示以非空字符作為結(jié)束符,[0-9.]*表示數(shù)字和點(diǎn)的組合
ip a |grep inet |grep eth0 |grep -o "inet[^/]*" |grep -o "[0-9.]*"  ##截取ip地址
ifconfig eth0 |grep -i hwaddr |awk '{print $5}'   ##截取MAC地址
ip a |grep -A 3 "eth0" |grep link/ether |grep -o "ether[^r]*" |grep -o -E "[0-9a-f:]+"|grep -E "[0-9a-f:]{2}$"      ##截取MAC地址

grep "^m" oldboy.log       ##過(guò)濾輸出以m開(kāi)頭的行
grep "m$" oldboy.log 
grep -vn "^$" oldboy.log       ##過(guò)濾空行
grep -o "0*" oldboy.log 
grep -o "oldb.y" oldboy.log 
grep "\.$" oldboy.log       ##以.結(jié)尾的行
grep "0\{3\}" oldboy.log       ##重復(fù)三次

--sed--

語(yǔ)法:sed [options] 'command' file(s)

選項(xiàng):

-n 抑制自動(dòng)打印pattern space,sed默認(rèn)輸出全部,-n用于取消默認(rèn)輸出
-i 編輯文件
-r 支持?jǐn)U展正則表達(dá)式

1.改:

語(yǔ)法:sed '/正則匹配條件/s/old/new/g' 文件
sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只是顯示,不修改
sed -i 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只修改,不顯示
sed -i 's/dhcp/static/g' ip ##將所有的dhcp替換為static
sed -i '/^IP1/s/static/dhcp/g' ip ##將IP1開(kāi)頭的行替換
sed -i '2s/static/dhcp/g' ip ##指定特定行號(hào)2行替換
cat -n /etc/selinux/config ##查看并顯示行號(hào)
sed -i '7s/disabled/enforcing/g' /etc/selinux/config ##開(kāi)啟selinux

2.刪:

語(yǔ)法:sed '/表達(dá)式/d' 文件
vim ip ##添加空行
sed '/^$/d' ip ##刪除空行并顯示在屏幕上
sed -i '/IP1/d' ip ##刪除包含IP1的行
sed -i '/^IP2/d' ip ##刪除以IP2開(kāi)頭的行
sed -i '2d' ip ##刪除第二行

3.增:

語(yǔ)法:sed ' /表達(dá)式/a "需要添加的文字"' 文件
sed 'a IP3=static' ip ##每一行后都加上IP3=static
sed '3a IP3=static' ip ##只在第3行后加上IP3=static,并顯示不修改
sed '3i IP3=static' ip ##只在第3行前加上IP3=static,顯示不修改
sed -i '3a IP3=static' ip ##修改,不顯示
sed -i '/^IP3/a "test add"' ip ##在以IP3開(kāi)頭的行后添加

4.查:

語(yǔ)法:sed -n '/表達(dá)式/p' 文件
sed -n '2p' /etc/hosts ##查看第二行
sed -n '/www/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看包含www的解析記錄
sed -n '/.100$/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看以.100結(jié)尾的行
sed -n '2~2p' ip ##從第二行,每隔兩行顯示

ifconfig eth0|sed -n '2p'|sed 's#.*dr:##g'|sed 's# Bc.*##g'    ##注:當(dāng)sed命令處理的內(nèi)容為多行內(nèi)容,則以/作為表達(dá)式的分隔,若sed命令處理的內(nèi)容為單行內(nèi)容,作為截取的作用,以#號(hào)作為分隔符;
10.0.0.9 
ifconfig eth0|sed -n '2p'|sed -r 's#(.*dr:)(.*)(Bc.*$)#\2#g'    ##-r支持?jǐn)U展正則,\2將2轉(zhuǎn)義,打印出第二個(gè)范圍(.*)
10.0.0.9 
ifconfig eth0|sed -n '2p'|sed -r 's#.*dr:(.*) Bc.*$#\1#g'
10.0.0.9 
ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bc.*$#\1#gp'
10.0.0.9
ifconfig eth0|sed -nr '1s#^.*dr (.*)#\1#gp'
00:0C:29:33:C8:75 
ifconfig eth0|sed -n '1p'|sed -r 's#(^.*dr )(.*)#\2#g'
00:0C:29:33:C8:75
ifconfig eth0|sed -n '1p'|sed 's#^.*dr ##g'      
00:0C:29:33:C8:75
ifconfig eth0|sed -nr '1s#^.*t (.*) 00.*$#\1#gp'
HWaddr
stat /etc/hosts|sed -n '4p'                
Access: (0644/-rw-r--r--) Uid: (  0/  root)  Gid: (  0/  root)
stat /etc/hosts|sed -n '4p'|sed 's#^.*ss: (##g'|sed 's#/-.*$##g'
0644
stat /etc/hosts|sed -n '4p'|sed -r 's#^.*s: \((.*)/-.*$#\1#g'
0644
stat /etc/hosts|sed -nr '4s#^.*s: \((.*)/-.*$#\1#gp'
0644
stat /etc/hosts|sed -nr '4s#(^.*s: \()(.*)(/-.*$)#\2#gp'
0644

--awk--

語(yǔ)法:
awk [選項(xiàng)] '模式{動(dòng)作(action)}' 文件1 文件2 ...
選項(xiàng): -F   指定輸入分隔符,可以是字符串或正則表達(dá)式
常用動(dòng)作: print、printf

chkconfig --list |grep 3:啟用 |awk '{print $1}'
tail -1 /etc/passwd |awk -F ':' 'BEGIN{OFS="---"}{print $1,$6,$7}'  ##OFS指定輸出分隔符
ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print $4}'
ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print "eth1_ip="$4}' ##可以加入顯示內(nèi)容
awk 'BEGIN {print "line one \nline two\nline three"}'

匹配范圍(ranges):指定的匹配范圍,格式為part1,part2

awk -F : '$3==3,$3==10{print $1,$3,$7}' /etc/passwd
awk -F : '$1=="root",$1=="adm"{print $1,$3,$7}' /etc/passwd
awk -F : '/^r/,/^a/{print $1,$3,$7}' /etc/passwd

awk區(qū)塊原理:

區(qū)域構(gòu)成:

BEGIN { 動(dòng)作 } ##開(kāi)始處理第一行文本之前的操作
{ 動(dòng)作 } ##針對(duì)每一行文本的處理操作
END { 動(dòng)作 } ##處理完最后一行文本之后的操作
執(zhí)行流程:
 首先執(zhí)行 BEGIN { } 區(qū)塊中的初始化操作;
 然后從指定的數(shù)據(jù)文件中循環(huán)讀取一個(gè)數(shù)據(jù)行(自動(dòng)更新 NF、 NR、 $0、 $1…… 等內(nèi)建變量的值),并執(zhí)行'模式或條件{ 動(dòng)作 }';
 最后執(zhí)行 END { } 區(qū)塊中的后續(xù)處理操作。

案例:

awk -F : 'BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd ##在awk處理之前打印頭部BEGIN{}
ifconfig eth0 |awk -F':' 'NR==2{print $2,$4}'|awk 'BEGIN{OFS=" / "}{print "IP="$1,"MASK="$3}'

awk的變量:
awk變量:
FS:列分隔符,默認(rèn)位空白
RS:行分隔符,默認(rèn)位換行符
OFS:輸出列分隔符
ORS :輸出行分隔符
awk內(nèi)置變量:
NR:處理中行數(shù)
FNR:?jiǎn)蝹€(gè)文件的行數(shù)
NF:列的個(gè)數(shù)

案例:

ifconfig eth1 |awk '{print NR}'
ifconfig eth1 |awk '{print NF}'


自定義變量案例:

awk 'BEGIN{test="www.linuxfan.cn";print test}'
awk -v test="linuxfan.cn" 'BEGIN{print test}'

printf的使用:

格式:printf "格式",列表1,列表2 ...

特征:

a.必須指定format(格式),用于指定后面item(列表)的輸出格式

b.printf語(yǔ)句不會(huì)自動(dòng)打印換行符:\n

c.format格式以%加一個(gè)字符,如下:

%c:顯示字符的ASCII碼
%d,%i:十進(jìn)制整數(shù)
%f:顯示浮點(diǎn)數(shù)(小數(shù))
%s:顯示字符串
%u:無(wú)符號(hào)整數(shù)
%%:顯示%

d.修飾符:N:顯示寬度,-:左對(duì)齊,+:顯示數(shù)值符號(hào),如%-c(左對(duì)齊)

案例:

chkconfig --list |grep 3:啟用 |awk '{printf "%-10s",$1}' ##在統(tǒng)一行顯示
awk -F : '{printf "%-15s %-10d %-10s\n",$1,$3,$7}' /etc/passwd

awk的操作符:

算數(shù)操作符: x^y、x/y、x+y、x-y、x%y
比較操作符:>、、>=、=、==、!=
邏輯操作符:、||、!

awk常見(jiàn)的模式類型

正則表達(dá)式(regexp):awk -F : '/^u/{print $1}' /etc/passwd

表達(dá)式(expression):值位非0或位非空是滿足條件,如$1 ~ /foo/或 $1 == "root"

案例:

awk -F : '$3>=500{print $1,$3,$7}' /etc/passwd ##打印普通用戶
awk -F : '$3+1=100$3+1>=10{print $1,$3,$7}' /etc/passwd ##UID在10-100之間的用戶
awk -F : '$2=="!!"{print $1,$2}' /etc/shadow ##檢查未初始化密碼的用戶
passwd -d u01 
awk -F : '$2==""{print $1}' /etc/shadow ##打印密碼為空的用戶
awk -F : '$7~"bash$"{print $1,$3,$7}' /etc/passwd ##匹配$7為bash結(jié)束行
awk -F : '$7!~"bash$"{print $1,$3,$7}' /etc/passwd

總結(jié)

以上所述是小編給大家介紹的shell腳本之正則表達(dá)式、grep、sed、awk ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

您可能感興趣的文章:
  • Shell正則表達(dá)式之grep、sed、awk實(shí)操筆記
  • Shell中正則表達(dá)式及sed和awk常見(jiàn)問(wèn)題

標(biāo)簽:蚌埠 萍鄉(xiāng) 衡水 大理 衢州 棗莊 廣元 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《shell腳本之正則表達(dá)式、grep、sed、awk》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    乌苏市| 仪征市| 天峻县| 绿春县| 双流县| 新宁县| 东港市| 郸城县| 商洛市| 南城县| 德阳市| 宜兰县| 滁州市| 武穴市| 乡城县| 安宁市| 天柱县| 达州市| 澄江县| 峨眉山市| 芷江| 青河县| 永和县| 三都| 巴塘县| 安义县| 南京市| 洪洞县| 广汉市| 乌拉特前旗| 襄城县| 北辰区| 璧山县| 外汇| 高密市| 隆昌县| 离岛区| 繁昌县| 开封市| 临武县| 昌邑市|