shell腳本-正則、grep、sed、awk

----------------------------------------正則----------------------------------------

基礎正則linux

^word     ##搜索以word開頭的 vi/vim中 ^ 一行的開頭 word$ ##搜索以word結尾的 vi/vim中 $ 一行的結尾 ^$ ##表示空行 . ##表明且只能表明任意一個字符 \ ##例:\. 只表明點自己,轉義符號,讓有特殊身份意義的字符,脫掉馬甲,還原 \n ##換行符 \r ##匹配回車 \w ##匹配任意一個字符和數字 * ##重複0次或屢次前面的一個字符 .*        ##匹配全部字符。例:^.* 以任意多個字符開頭,.*$以任意多個字符結尾 [abc] ##匹配字符集內的任意一個字符 [^abc]    ##匹配不包含 ^ 後的任意字符的內容。中括號裏的 ^ 爲取反 [1-9] ##表示匹配括號內的範圍內的任意字符 a\{n,m\} ##重複n到m次前一個重複的字符。若用egrep、sed -r能夠去掉斜線 \{n,\} ##重複至少n 次前一個重複的字符。若用egrep、sed -r能夠去掉斜線 \{n\} ##重複n 次前一個重複的字符。若用egrep、sed -r能夠去掉斜線 \{,m}\ ##重複少於m次

注:egrep,grep –E或sed –r 過濾通常特殊字符能夠不轉義正則表達式

擴展正則(egrep或grep -E)express

+ ##重複一次或一次以上前面的一個字符 ? ##重複0次或一次前面的一個字符 | ##或者的意思,用或的方式查找多個符合的字符串 () ##找出括號內的字符串
^linux ##以linux開始 linux$ ##以linux結束 linuxfan. ##匹配linuxfans等 coo[kl] ##匹配cool或cook 9[^5689] ##匹配91,92等,但不匹配95,96,98,99 [0-9] ##匹配任意一個全部的數字 [a-z]|[A-Z] ##匹配任意一個全部大小寫字母,|屬於擴展正則grep -E支持 colou?r ##匹配color或colour,可是不能匹配colouur rollno-9+ ##匹配rollno-九、rollno-99,rollno-999,但不匹配rollno- co*l ##匹配cl,col,cool,coool等 ma(tri)x ##匹配matrix [0-9]{3} ##匹配任意一個三位數,等於[0-9][0-9][0-9] [0-9]{2,} ##匹配任意一個兩位數或更多位的數字 [0-9]{2,5} ##匹配從兩位數到五位數之間的任意一個數字 Oct (1st|2nd) ##匹配Oct 1st或Oct 2nd a\.b ##匹配a.b,但不能匹配ajb [a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4} ##匹配一個郵箱地址 [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ##匹配IP地址

----------------------------------------grep----------------------------------------

語法:grep [選項] [條件表達式] 目標文件vim

 

cat /proc/meminfo |grep -e Mem -e Cache -e Swap ##查看系統內存、緩存、交換分區-e的做用是匹配多個表達式 grep -R -o -n -E '[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}' /etc/ ##查找/etc目錄下的全部文件中的郵件地址;-R遞歸,-n表示匹配的行號,-o只輸出匹配內容,-E支持擴展正則表達式, grep -R -c 'HOSTNAME' /etc/ |grep -v "0$" ##查找/etc/目錄下文件中包含「HOSTNAME」的次數,-c統計匹配次數,-v取反 grep -R -l 'HOSTNAME' /etc/ ##查找包含「HOSTNAME」的文件名,-l顯示匹配的文件名,-L顯示不匹配的文件名 dmesg | grep -n --color=auto 'eth' ##查找內核日誌中eth的行,顯示顏色及行號 dmesg | grep -n -A3 -B2 --color=auto 'eth' ##用 dmesg 列出核心信息,再以 grep 找出內含 eth 那行,在關鍵字所在行的前兩行與後三行也一塊兒找出出來顯示 cat /etc/passwd |grep -c bash$ ##統計系統中能登陸的用戶的個數 touch /tmp/{123,123123,456,1234567}.txt ##建立測試文件,如下三條命令是同樣的效果,匹配文件名123,能夠包含1個到多個 ls |grep -E '(123)+' ls |grep '\(123\)\+' ls |egrep '(123)+' ps -ef |grep -c httpd ##統計httpd進程數量 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}' ##獲取網卡名稱 ifconfig eth0 |grep -E -o 'inet addr:[^ ]*' |grep -o '[0-9.]*' ##截取ip地址,[^ ]*表示以非空字符做爲結束符,[0-9.]*表示數字和點的組合 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 ##過濾輸出以m開頭的行 grep "m$" oldboy.log grep -vn "^$" oldboy.log ##過濾空行 grep -o "0*" oldboy.log grep -o "oldb.y" oldboy.log grep "\.$" oldboy.log  ##以.結尾的行 grep "0\{3\}" oldboy.log ##重複三次

----------------------------------------sed----------------------------------------

語法:sed [options] 'command' file(s)緩存

選項:bash

-n 抑制自動打印pattern space,sed默認輸出所有,-n用於取消默認輸出測試

-i 編輯文件spa

-r 支持擴展正則表達式日誌

1.改:code

語法: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開頭的行替換

sed -i '2s/static/dhcp/g' ip ##指定特定行號2行替換

cat -n /etc/selinux/config ##查看並顯示行號

sed -i '7s/disabled/enforcing/g' /etc/selinux/config ##開啓selinux

2.刪:

語法:sed '/表達式/d' 文件

vim ip ##添加空行

sed '/^$/d' ip ##刪除空行並顯示在屏幕上

sed -i '/IP1/d' ip ##刪除包含IP1的行

sed -i '/^IP2/d' ip ##刪除以IP2開頭的行

sed -i '2d' ip ##刪除第二行

3.增:

語法:sed ' /表達式/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開頭的行後添加

4.查:

語法:sed -n '/表達式/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結尾的行

sed -n '2~2p' ip ##從第二行,每隔兩行顯示

ifconfig eth0|sed -n '2p'|sed 's#.*dr:##g'|sed 's# Bc.*##g' ##注:當sed命令處理的內容爲多行內容,則以/做爲表達式的分隔,若sed命令處理的內容爲單行內容,做爲截取的做用,以#號做爲分隔符; 10.0.0.9 ifconfig eth0|sed -n '2p'|sed -r 's#(.*dr:)(.*)(Bc.*$)#\2#g' ##-r支持擴展正則,\2將2轉義,打印出第二個範圍(.*) 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----------------------------------------

語法:

awk [選項] '模式{動做(action)}' 文件1 文件2 ...

選項: -F   指定輸入分隔符,能夠是字符串或正則表達式

經常使用動做: 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}' ##能夠加入顯示內容 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區塊原理:

區域構成:

BEGIN { 動做 } ##開始處理第一行文本以前的操做

{ 動做 } ##針對每一行文本的處理操做

END { 動做 } ##處理完最後一行文本以後的操做

執行流程:

首先執行 BEGIN { } 區塊中的初始化操做;

而後從指定的數據文件中循環讀取一個數據行(自動更新 NF、 NR、 $0、 $1…… 等內建變量的值),並執行'模式或條件{ 動做 }';

最後執行 END { } 區塊中的後續處理操做。

案例:

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:列分隔符,默認位空白

RS:行分隔符,默認位換行符

OFS:輸出列分隔符

ORS :輸出行分隔符

awk內置變量:

NR:處理中行數

FNR:單個文件的行數

NF:列的個數

案例:

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語句不會自動打印換行符:\n

c.format格式以%加一個字符,以下:

%c:顯示字符的ASCII碼

%d,%i:十進制整數

%f:顯示浮點數(小數)

%s:顯示字符串

%u:無符號整數

%%:顯示%

d.修飾符:N:顯示寬度,-:左對齊,+:顯示數值符號,如%-c(左對齊)

案例:

chkconfig --list |grep 3:啓用 |awk '{printf "%-10s",$1}' ##在統一行顯示

awk -F : '{printf "%-15s %-10d %-10s\n",$1,$3,$7}' /etc/passwd

awk的操做符:

算數操做符: x^y、x/y、x+y、x-y、x%y

比較操做符:>、<、>=、<=、==、!=

邏輯操做符:&&、||、!

awk常見的模式類型

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

表達式(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結束行

awk -F : '$7!~"bash$"{print $1,$3,$7}' /etc/passwd

相關文章
相關標籤/搜索