標籤:
Shell中的Regex
VBird說學習Linux,掌握了Shell和正則就相當於打通了任督二脈,此後能力的成長才會突飛猛進。
Shell的基礎學習之前已經總結了一篇部落格:http://www.cnblogs.com/jyzhao/p/4485553.html
本文將總結Shell中的Regex及常用的字元處理命令,為打通任督二脈奠定基礎^_^。
- 基礎Regex舉例說明
字元截取命令
字元處理命令
1. 基礎Regex舉例說明
*
,.
,\
,^word
,word$
,[list]
,[^list]
,[n1-n2]
,\{n\}
,\{n,m\}
例1:簡易判斷日期格式
比如:2015-05-11,只是簡單判斷數位格式。
^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}$
例2:簡易判斷IP地址格式
比如:192.168.1.100,只是簡單判斷數位格式。
[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
例3:找出1.txt文字檔中以字母開頭的以及不是以字母開頭的行。
以字母開頭的行:
grep --color=auto "^[a-z,A-Z]" 1.txt
不是以字母開頭的行:
grep --color=auto "^[^a-z,A-Z]" 1.txt
2. 字元截取命令cut命令
用途:對於分隔字元規範的文本進行特定截取某些列,特點是簡單易用。
例4:cut截取出使用者名稱以及對應的uid,gid,過濾掉包含‘/sbin‘的行。
grep -v "/sbin" /etc/passwd | cut -f 1,3,4 -d ":"
截取結果樣本:
root:0:0oracle:500:500grid:501:500
awk命令
用途:對於分隔字元不規範的文本進行截取,特點是功能強大,文法比cut命令複雜。
awk ‘條件類型1{動作1}條件類型2{動作2} ...‘ filename
awk的內建變數:
NF 每一行($0)擁有的欄位總數NR 目前awk所處理的是“第幾行”資料FS 目前的分隔字元,預設是空格鍵
awk的邏輯運算子:
>, <, >=, <=, ==, !=
例5:查詢pmon進程的PID。
ps -ef | grep pmon | grep -v grep | awk ‘{print $2}‘
例6:列印出/etc/passwd中uid<3的使用者和他們的uid。
cat /etc/passwd | awk ‘BEGIN{FS=":"} $3 < 3 {print $1 "\t" $3}‘
註:注意BEGIN在這裡的用途,沒有BEGIN第一行顯示會不正確。
例7:截取出系統根目錄的磁碟空間使用率
df -h | awk ‘{print $5}‘|cut -f 1 -d "%"
sed命令
sed可以將資料進行替換、刪除、新增、選取特定行。
-n 只有經過sed處理的才顯示(預設顯示全部)-e 直接在命令列模式上進行sed的動作編輯-f 將sed的動作寫入一個檔案,然後-f filename執行filename中的sed命令-r 支援擴充型Regex文法(預設是基礎Regex文法)-i 直接修改讀取的檔案內容,而不是預設的螢幕輸出結果
例8:顯示行號並列印出/etc/hosts,刪除檔案的前兩行。
nl /etc/hosts | sed ‘1,2d‘
例9:把/etc/hosts檔案中的JY-DB全部替換為Alfred-DB顯示出來
sed -e ‘s/JY-DB/Alfred-DB/g‘ /etc/hosts
註:此處不寫-e
參數也可以,如果兩個及以上sed命令需要每個前面都寫-e
參數。
例10:直接修改/etc/hosts檔案,在檔案的第2行下插入新的一行“192.168.1.100 JY-DB”
sed -i ‘2a 192.168.1.100 JY-DB‘ /etc/hosts
3. 字元處理命令sort命令
用途:對結果進行排序顯示。
du -sk * | sort -rn
sort -t ":" -k "3,3" /etc/passwd
sort -n -t ":" -k "3,3" /etc/passwd
wc命令
用途:統計結果行,單詞,字元的數量。
統計行wc -l
例11:統計oracle的使用者進程數
ps -ef | grep LOCAL=NO | grep -v grep | wc -l
統計單詞wc -w
例12:統計/etc/issue檔案的單詞數
wc -w /etc/issue
統計字元wc -m
例13:統計/etc/issue檔案的字元數
wc -m /etc/issue
Shell中的Regex