天天看點

Shell腳本(二)-初識文本處理三基友grep|sed|awk

grep、sed和awk都是Linux中的文本處理工具。

grep:文本過濾器,使用特定模式比對搜尋文本,并預設輸出比對行。

sed:文本編輯器,操作純ASCII碼的文本,操作文本的時候按行進行操作,也叫行編輯器。

awk:文本報告生成器,現有的功能最強大的資料處理引擎之一。

grep

grep:Global search regular expression and print out the line全面搜尋研究正規表達式并顯示出來
grep的基本格式:
grep [OPTION]... PATTERN [FILE]...

grep的常用參數:
-E:支援擴充的正規表達式(egrep)
-F:不支援正規表達式(fgrep)
-n:顯示行号
-c:顯示比對到的行數
-i:忽略大小寫
-v:顯示不比對的行
-w:比對整個單詞(如 grep bin /etc/passwd 不會比對到sbin)
-e:多條件,或的關系(如 -e root -e jinx 則過濾出含有root或jinx的行)

例:

           

常用的正規表達式

##表示比對位置
^jinx    ##以jinx開頭的行
jinx$    ##以jinx結尾的行
‘j..x’   ##以j開頭,x結尾的四位字元串
‘j...’    ##以j開頭的四位字元串
‘...x’    ##以x結尾的四位字元串
\<jinx    ##以jinx開頭的單詞
jinx\>    ##以jinx結尾的單詞
\<jinx\>    ##比對整個單詞
##表示比對字數
*        ##前面的字元任意次
.*        ##任意字元,任意長度
\?        ##前面的字元0或1此
\+        ##前面的字元至少出現一次
\{N\}    ##前面的字元出現N次
\{M,N\}    ##前面的字元出現M-N次
\{0,N\}    ##前面的字元出現0-N次
\{M,\}    ##前面的字元
\(xy\)\{n\}    ##關鍵字xy出現n次
           

sed

sed:stream editor 文本編輯器,以行為機關的文本編輯工具,可以直接修改檔案
sed的基本格式:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed對字元的處理操作:
g:表示全面替換
p:顯示
d:删除
a:行後添加
i:行前插入
c:替換指定的行
s:替換指定字元
w:寫入檔案
=:顯示行号


對文本的操作
##顯示帶:的行
[[email protected] shell]# sed -n '/\:/p' fstab     ##:在linux中有特殊含義,需要使用\符進行轉義
# Created by anaconda on Wed May  7 01:22:57 2014

##顯示以UUID開頭的行
[[email protected] shell]# sed -n '/^UUID/p' fstab 
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1

##顯示指定的行    -e添加多個條件
[[email protected] shell]# sed -n '4,6p' fstab             ##顯示第四行至第六行
[[email protected] shell]# sed -n -e '4p' -e '6p' fstab     ##顯示第四行和第六行

[[email protected] shell]# sed '/^$/d' fstab            ##不顯示空白行
[[email protected] shell]# sed '/^UUID/d' fstab         ##不顯示UUID開始的行
[[email protected] shell]# sed '1,4d' fstab             ##不顯示1-4行

##指定行插入字元
[[email protected] shell]# sed '/^UUID/a \hello world\njinx' fstab    ##\n換行符,插入多行字元
[[email protected] shell]# sed '/^UUID/i \hello world\njinx' fstab    ##在行前插入内容

[[email protected] shell]# sed '/^UUID/c \hello world\njinx' fstab    ##替換指定行

[[email protected] shell]# sed -n '/^UUID/w /tmp/fstab' fstab        ##将UUID起始的行寫入/tmp/fstab檔案中

[[email protected] shell]# sed '/^UUID/=' /etc/fstab                ##在指定行前顯示行号

[[email protected] shell]# sed '6r /etc/issue' fstab                ##将issue檔案的内容從第六行插入

##替換指定字元
[roo[email protected] shell]# sed 's/^#/\//' fstab                    ##把行首的#換成/
[[email protected] shell]# sed 's/\:/#/g' /etc/passwd              ##将:替換成#,g為全文比對,#g為從第#個比對處開始替換,預設隻替換第一個

##其他用法
[[email protected] shell]# sed 'G' fstab                           ##每行之間增加一行空白行
[[email protected] shell]# sed '=' fstab | sed 'N; s/\n/ /'        ##每行行首添加行号
           

awk

awk報告生成器,名稱出自三位建立者的姓氏,現在Linux系統中常用的是gawk
[[email protected] ~]# ls -l /bin/awk
lrwxrwxrwx. 1 root root 4 May  6  2014 /bin/awk -> gawk

awk的指令格式:
awk [-f|-F|-v] 'BEGIN{}//{}END{}' FILE
-f:調用腳本
-F:指定分隔符
-v:定義變量var=val
BEGIN:讀入第一行文本之前執行
//:比對代碼塊,可以是字元串或正規表達式
{}:指令代碼塊,可以包含多條指令,多條指令使用;分号分隔
END:處理完文本最後一行之後執行

awk的處理機制:
awk會逐行處理文本,并對文本進行切片(預設分隔符使用空白字元),并在内部用一個變量引用
$0    ##代表一整行
$1    ##代表第一串字元
$2    ##代表第二串字元
$3    ##代表第三串字元
NR    ##每行的行号
NF    ##字段數量

awk的基本用法
[[email protected] shell]# cat passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

##列印檔案名,檔案共七行,列印出七個檔案名,證明awk是逐行處理
[[email protected] shell]# awk '{print FILENAME}' passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd

##每行列印行号和列數
[[email protected] shell]# awk -F : "{print NR,NF}" passwd
1 7
2 7
3 7
4 7
5 7
6 7
7 7

##BEGIN讀取檔案前執行,END讀取檔案結束後執行
[[email protected] shell]# awk -F : 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd
NAME
root
bin
daemon
adm
lp
sync
shutdown
END

##列印以ro字元開頭的行
[[email protected] shell]# awk -F : '/^ro/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

##列印以a-d字元開頭的行
[[email protected] shell]# awk -F : '/^[a-d]/{print}' passwd
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

##指定分隔符,列印bash結尾的行的第一串字元
[[email protected] shell]# awk -F : '/bash$/{print $1}' passwd
root

##第六串字元以bin結尾的行,列印第一和第六串字元
[[email protected] shell]# awk -F : '$6~/bin$/{print $1,$6}' passwd
bin /bin
daemon /sbin
sync /sbin
shutdown /sbin

##第七串字元不是nologin結尾的行,列印第一和第七串字元
[[email protected] shell]# awk -F : '$7!~/nologin$/{print $1,$7}' passwd
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown

###輸出eth0的IP位址:
[[email protected] shell]# ifconfig eth0 | grep 'inet\>' | awk '{print $2}'
172.25.254.143