1. 程式人生 > 實用技巧 >shell 字串操作

shell 字串操作

在做shell批處理程式時候,經常會涉及到字串相關操作。有很多命令語句,如:awk,sed都可以做字串各種操作。其實shell內建一系列操作符號,可以達到類似效果,大家知道,使用內部操作符會省略啟動外部程式等時間,因此速度會非常的快

工作中字串操作舉例
filename='/home/admin/jobs/CnClickstat/DFSLoader/loader.cfg'
#下面是使用shell字串操作
buName1=${filename#*/jobs/} #去除'/home/admin/jobs/CnClickstat/DFSLoader/loader.cfg'字首得到'CnClickstat/DFSLoader/loader.cfg
' buName1=${buName1%%/*} #去除'CnClickstat/DFSLoader/loader.cfg'字尾得到'CnClickstat' echo $buName1 #下面用awk獲取需要的字串內容 buName2=`echo $filename | awk -F / '{printf("%s", $5)}'`; echo $buName2 #下面使用cut獲取需要的字串內容 buName3=`echo $filename | cut -d / -f 5`; echo $buName3 以上均能獲得結果:CnClickstat 字串操作舉例結束

加入了“*” 不是意思是: 當然, 如果變數var已經被設定的話, 那麼其值就是$var.

[chengmo@localhost 
~]$ echo ${abc-'ok'} ok [chengmo@localhost ~]$ echo $abc [chengmo@localhost ~]$ echo ${abc='ok'} ok [chengmo@localhost ~]$ echo $abc ok 如果abc 沒有宣告“="還會給abc賦值。 [chengmo@localhost ~]$ var1=11;var2=12;var3= [chengmo@localhost ~]$ echo${!v@} var1 var2 var3 [chengmo@localhost ~]$ echo ${!v*} var1 var2 var3 ${
!varprefix*}與${!varprefix@}相似,可以通過變數名字首字元,搜尋已經定義的變數,無論是否為空值。

說明:"* $substring”可以是一個正則表示式.

1.長度

[web97@salewell97 ~]$ test='I love china'
[web97@salewell97 ~]$ echo ${#test}
12
${#變數名}得到字串長度

2.擷取字串

[chengmo@localhost ~]$ test='I love china'
[chengmo@localhost ~]$ echo ${test:5}
e china
[chengmo@localhost ~]$ echo ${test:5:10}
e china
${變數名:起始:長度}得到子字串

3.字串刪除

[chengmo@localhost ~]$ test='c:/windows/boot.ini'
[chengmo@localhost ~]$ echo ${test#/}
c:/windows/boot.ini
[chengmo@localhost ~]$ echo ${test#*/}
windows/boot.ini
[chengmo@localhost ~]$ echo ${test##*/}
boot.ini
[chengmo@localhost ~]$ echo ${test%/*}
c:/windows
[chengmo@localhost ~]$ echo ${test%%/*}
${變數名#substring正則表示式}從字串開頭開始配備substring,刪除匹配上的表示式。
${變數名%substring正則表示式}從字串結尾開始配備substring,刪除匹配上的表示式。
注意:${test##*/},${test%/*} 分別是得到檔名,或者目錄地址最簡單方法。

4.字串替換

[chengmo@localhost ~]$ test='c:/windows/boot.ini'
[chengmo@localhost ~]$ echo ${test/\//\\}
c:\windows/boot.ini
[chengmo@localhost ~]$ echo ${test//\//\\}
c:\windows\boot.ini

${變數/查詢/替換值}一個“/”表示替換第一個,”//”表示替換所有,當查詢中出現了:”/”請加轉義符”\/”表示。

三、效能比較

在shell中,通過awk,sed,expr等都可以實現,字串上述操作。下面我們進行效能比較。
[chengmo@localhost ~]$test='c:/windows/boot.ini'
[chengmo@localhost ~]$ time for i in $(seq 10000);doa=${#test};done;
real 0m0.173s
user 0m0.139s
sys 0m0.004s
[chengmo@localhost ~]$ time for i in $(seq 10000);do a=$(expr length$test);done;
real 0m9.734s
user 0m1.628s

速度相差上百倍,呼叫外部命令處理,與內建操作符效能相差非常大。在shell程式設計中,儘量用內建操作符或者函式完成。使用awk,sed類似會出現這樣結果。