學(xué)會(huì)截取Unix字符串的方法
有時(shí)候系統(tǒng)管理員需要截取Unix字符串的自串來(lái)完成特定的任務(wù)。如現(xiàn)在系統(tǒng)工程師需要對(duì)某個(gè)文件根據(jù)系統(tǒng)的時(shí)間來(lái)進(jìn)行命名,其命名的規(guī)則為年份(***兩位)加月份的形式,即0906表示這個(gè)文件是09年6月份創(chuàng)建的。因?yàn)槊總€(gè)月創(chuàng)建一個(gè)獨(dú)立的日志文件,為此按這個(gè)格式對(duì)其進(jìn)行命名算是比較合理的。
但是在系統(tǒng)中實(shí)現(xiàn)起來(lái)有一定的困難。然后通過(guò)date命令加上一些可選項(xiàng)參數(shù)可以截取日期的年份、月份等信息。可是利用date命令截取的年份是四位數(shù)字(如 2009),而不是兩位數(shù)字。這跟系統(tǒng)工程師的需求還有一定的距離。那么如果一定要采用年份的兩位數(shù)字來(lái)對(duì)文件或者文件夾進(jìn)行命名,該如何處理呢?
此時(shí)就需要用到expr命令的另一個(gè)功能,即截取Unix字符串的功能。一般來(lái)說(shuō),expr命令主要有三個(gè)功能,分別為求字符串的長(zhǎng)度、截取字符子串、求一個(gè)字符在一個(gè)Unix字符串中的位置。當(dāng)然如果這些功能跟其他命令結(jié)合使用的話,可以實(shí)現(xiàn)一些比較復(fù)雜的需求。在Unix系統(tǒng)中,如果需要截取字符串的話,筆者首先建議的是采用一些自帶的命令。
如date %w則表示顯示今天星期幾。雖然expr命令也可以實(shí)現(xiàn)類似的功能,但是初期起來(lái)比較麻煩。為此對(duì)于截取Unix字符串筆者建議,能夠使用系統(tǒng)自帶功能來(lái)實(shí)現(xiàn)的,那么就使用系統(tǒng)自帶的命令。如果沒(méi)有的話,那么就只有用過(guò)expr命令來(lái)實(shí)現(xiàn)。也就是說(shuō),expr 是一個(gè)通用的命令,所有的Unix字符串截取工作其都可以完成。
只是代碼書(shū)寫(xiě)起來(lái)沒(méi)有那些系統(tǒng)自帶命令那么簡(jiǎn)單。如果現(xiàn)在系統(tǒng)工程師需要截取年份的后兩位數(shù)字,此時(shí)該如何處理呢?在系統(tǒng)轉(zhuǎn)義字符的幫助下,可以完成這個(gè)功能。如下所示:$expr “2009” : ‘..\(..\)’
在實(shí)現(xiàn)這個(gè)功能的時(shí)候,筆者使用了\這個(gè)轉(zhuǎn)義字符。這個(gè)正則表達(dá)式的含義就表示只考慮前面這個(gè)Unix字符串的***兩個(gè)字符,而忽略其他的字符。若需要利用上面這個(gè)規(guī)則來(lái)進(jìn)行文件命令的話,只需要先利用這個(gè)命令截取年份的***兩位,然后再把月份加上去即可。
上面的Unix字符串2009系統(tǒng)工程師也可以使用變量來(lái)代替。系統(tǒng)工程師需要注意的是這個(gè)正則表達(dá)式的書(shū)寫(xiě)方法。在使用expr命令來(lái)對(duì)字符串進(jìn)行處理,其難點(diǎn)就在于這個(gè)正則表達(dá)式的書(shū)寫(xiě)。
通常情況下,只要合理編寫(xiě)這個(gè)正則表達(dá)式,則其Unix字符串的處理功能,并不會(huì)比數(shù)據(jù)庫(kù)系統(tǒng)中Unix字符串處理函數(shù)來(lái)的差,甚至有過(guò)之而不及?,F(xiàn)在的主要問(wèn)題是,由于經(jīng)驗(yàn)有限,系統(tǒng)工程師往往很難根據(jù)用戶需求來(lái)定義這個(gè)正則表達(dá)式。
就連筆者有時(shí)候也會(huì)在這里卡住。如果系統(tǒng)工程師想要提高自己正則表達(dá)式的書(shū)寫(xiě)能力,那么多看看其他系統(tǒng)工程師書(shū)寫(xiě)的腳本,往往能夠在最短時(shí)間內(nèi)提高自己正則表達(dá)式的書(shū)寫(xiě)水平。
【編輯推薦】