天天看點

shell中的文本處理之grep,sed,awk

1 grep文本過濾指令

grep中的正規表達式

grep ^root passwd #過濾以root開頭的行
grep root$ passwd #過濾以root結尾的行
grep -i ^root passwd #不區分大小寫,過濾以root開頭的行
grep -E "^root | root$" passwd #過濾以root開頭或root結尾的行,-E表示擴充正規表達式
grep -E -v "^root | root$" passwd # -v 表示反向過濾
grep -E -v "^root | root$" passwd |grep root #過濾root在中間的行
grep -i root passwd | grep -v -i -E "^root | root$" #過濾root在中間的行


grep 'r.t' test #過濾r和t之間隻有一個字元
grep 'r..t' test #過濾r和t之間有兩個字元
grep 'r...t' test #過濾r和t之間有三個字元
grep 'r*t' test # 過濾r出現的任意次數
grep 'r\**t' test #過濾r,t之間有0個字元
grep 'ro*t' test #過濾r和t之間o出現的任意次數
grep -E 'ro*t' test #過濾r和t之間o出現的任意次數
grep -E 'ro?t' test #過濾r和t之間o出現的0和1次
grep -E 'ro{1,}t' test #過濾r和t之間o出現的1次以上
grep -E 'ro{,3}t' test #過濾r和t之間o出現的3以下的次數


grep -E 'r....' test #過濾r之後出現4個字元
grep -E 'r....\' test#精确比對
grep -E '\<....r' test #過濾r之前出現4個字元
           

應用: 編寫腳本檔案,使輸出可以登入系統的使用者

vim show_loginuser.sh
#!/bin/bash
SHELL=$(echo `grep -v nologin /etc/shells ` | sed 's//|/g')
grep -E "$SHELL" /etc/passwd | cut -d : -f l
           

2 sed 行編輯器

p模式(顯示)

sed -n '^:/p' fstab #顯示fstab中以:開頭的行
sed -n 'UUID$/p' fstab #顯示fstab中以UUID結尾的行
sed -n '/^UUID/p' fstab #顯示fstab中以UUID開頭的行
sed -n '2,6p' fstab #顯示fstab中的第二行和第六行
sed -n '2,6!p' fstab #顯示fstab中除過第二行和第六行其餘的行
           

d模式(删除,隻是顯示的時候删除,并不删除原檔案)

sed '/^UUID/d' fstab #删除以UUID開頭的行
sed '/^#/d' fstab #删除以#開頭的行
sed '/^$/d' fstab #删除以空格開頭的行
sed '/^UUID/!d' fstab #删除不是以UUID開頭的行
cat -n fstab | sed '1,4d' #删除1到4行
cat -n fstab | sed  -e '2d,6d' #删除第二行和第六行
           

a模式(添加,預設在最後一行添加)

sed '/^UUID/a\hello' fstab #在以UUID開頭的行的前一行添加hello
sed '/^UUID/a\hello' \newstos fstab #在以UUID開頭的行的前一行添加hello換行再添加westos
           

i模式(插入)

sed '/^UUID/i\hello' fstab #在UUID的前一行添加hello
           

c模式(替換)

sed '/^UUID/c\hello'  fstab #把以UUID開頭的行替換成hello
           

w模式(寫入)

sed '/^UUID/wwestos' fstab
sed -n '/^UUID/wwestos' fstab
sed '/^UUID/=' fstab #顯示以UUID開頭所在的行号
sed '6r westos' fstab
           

3 awk報告生成器

awk處理機制:awk會逐行處理文本,支援在處理第一行之前做一些準備工作,以及在處理完最後一行,做一些總結性質的工作,在指令格式上分别展現如下:

BEGIN{}:讀入第一行文本之前執行,一般用來初始化操作
{}     :逐行處理,逐行讀入文本執行相應的處理,是最常見的編輯指令塊
END{}  :處理完最後一行文本之後執行,一般用來輸出處理結果


awk -F ":" '{print $1}' passwd #以:為分隔符,顯示第一列
awk -F ":" 'BEGIN{print "NAME"}{print $1}' passwd #以NAME開始顯示第一列
awk -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}' passwd #以NAME開始,以END結束,顯示第一列并顯示行号
awk -F ":" 'BEGIN{print "NAME"}{print NR;print }END{print "END"}' passwd #顯示行号并換行
awk -F ":" '/bash$/{print $1}' passwd #sh 結尾的行第一列,$1表示第一列
awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd #統計passwd中以bash結尾的行數
awk -F '/^ro/{print}' passwd #列印以ro開頭的行
awk -F '/^[a-d]/{print}' passwd #列印以a到d開頭的行
awk -F '/^a|nologin$/{print}' passwd #列印以a開頭或者以nologin結尾的行
awk -F ":"  '$1~/^r/{print}' passwd#列印以r開頭的行
awk -F ":" '$1!~/^r/{print}'  passwd#列印不以r開頭的行
awk -F ":" '{print NR,$0}' passwd #以:為分隔符列印第一列,并表示行号,$0表示檔案一整行的内容
           

應用:

1 計算顯示能夠登入系統的使用者個數

awk -F ":" 'BEGIN{n=0}$5!~/^\/home/&&/bash/{n++}END{print n}' /etc/passwd
           

2 找出系統中可以登入系統,但使用者家目錄不在/home下

awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
           

3 抓取eth0的網卡ip

ifconfig eth0 | awk -F "" '/inet\>/{print $2}'
           

4 統計在系統中可以登入系統的使用者

awk -F ":" '$5!~/^\/home/&&/bash/{print $1}' /etc/passwd
           

5 統計檔案的行數

awk 'BEGIN{n=0}{n++}END{print n}' /etc/passwd
           

繼續閱讀