天天看點

《Linux指令、編輯器與Shell程式設計》讀書筆記3-linux指令中的特殊字元和正規表達式

由于這裡是在bash下做的實驗,有些地方與csh略有不同,詳情:

http://www.cnblogs.com/itech/archive/2012/02/21/2361184.html

一、linux指令中的特殊字元

1. 雙引号"

(1)列印輸出時将系統保留符号屏蔽、以保證正常輸入,如:

echo Alix; Mary

echo "Alix; Mary"

*分号;表示一個指令結束、另一個 指令開始執行,如果不加"的話,則隻輸出Alix,執行到Mary時會報錯

(2)在雙引号中引用其他指令輸出符,如引用變量:

name="mary"

echo "Alix;$name"

echo "$name"

*當然,在第三行指令中不加”也能執行出正确的結果,但是為了在編寫大型腳本時降低錯誤率,建議養成把特殊引用符都放到“内的良好習慣

此外,還可以直接引用指令輸出,這時要用反引号`把指令字括起來(下面會詳細講道):

echo "Now time: `date -u` "

(3)在指令中使用雙引号避免shell誤解,如:

name="jhon alix jack;mary roman"

echo $name | grep "jhon alix"

echo $name | grep jhon alix

第二行由于使用了",能夠正确執行、找到包含jhon alix的變量,但如果不加、第三行指令會報錯。

2. 單引号‘

單引号的用途和雙引号一緻,此外還表示引用中的引用,因為shell中不允許一條指令中的兩個引号都使用雙引号或單引号;如:

awk 'BEGIN{system("date")}'

3. 反引号`:指令引用符,如:

ls -l `cat /etc/shells`

echo "Now time: `date +'%T'`"

echo "Are using this system users: `who | awk '{ARR [FNR]=$1;}END {printf "%s %s\n" ,ARR[1],Arr[2];}'`"

4. 變量引用和指令轉換符$,如:

#将指令date的執行結果賦給變量a

a=`date`

echo "The time is: $a"

#如果是csh,需要在變量名前面加set

#下面的格式,隻能在bash裡用,csh裡會隻能用ls -l `cat /etc/shells`實作該功能

ls -l $(cat /etc/shells)

5. 屏蔽特殊符号字元\,如:

#bash格式

echo "Please pay \$15."

echo "Tom:\"What is your name?\""

6. 字元範圍比對符[]

#檢視目前目錄中以kls中任意字幕開頭的所有檔案:

ls -l [kls]*

#檢視檔案名中包含0~9的檔案:

ls -l *[0-9]*

#檢視檔案名中包含a~Z的檔案:

ls -l *[a-Z]*

7. 範圍排除[!]

#檢視檔案名是三個字元且第一個在0~9範圍、第二個不在0~9範圍、第三個任意的檔案:

ls -l [0-9][!0-9]*

*此外還有單字通配符?,多字通配符*

8. 邏輯或||

command1 || command2

先執行command1,如果成功則直接顯示結果、跳過command2;否則再執行command2

例1:

mail -f /root/mbox >/dev/null || echo "Permission denied"

9. 邏輯與&&

command1 && command2

和邏輯或相反,先執行command1,如果成功,才執行command2;否則執行終止:

wget http://www.baidu.com &>/dev/null && echo "`date` Host baidu service is running."

可以和下面的語句比較一下結果的不同:

wget http://www.baidu.com || echo "`date` Host baidu service is running."

《Linux指令、編輯器與Shell程式設計》讀書筆記3-linux指令中的特殊字元和正規表達式

10. 括号:

如果将指令放到圓括号内,執行多指令時會優先執行括号内的指令;而花括号則在函數中被使用(見第17章)

二、指令中的正規表達式:

正規表達式不止在shell腳本中使用,平時在grep、vi、awk、sed等指令工具中也可以使用。

1. 與檔案名比對同理,使用反斜杠\屏蔽特殊字元,如:

# ; $ ` " . ^ ? [ ] \ || &&

(1)比如做乘法運算時:

expr 25 \* 25

625

(2)在指令中輸出特殊符号:

echo \#notes\\

#notes\

(3)表示檔案名^^.txt

/\^\^\.txt/

2. 單字元比對符.

*使用查找模式時,通常要将表達式放入兩個斜杠 //中,然後再放入指令中。後面不在贅述。

/.i../,有可能比對到xian,就這個意思。

3. *單/多字元比對符

4. 行首比對符^

用來比對每一行第一列中符合搜尋條件的字元串:

/^eth0/

5. 行尾比對符$

與上面類似,用來比對行尾符合搜尋條件的字元串:

《Linux指令、編輯器與Shell程式設計》讀書筆記3-linux指令中的特殊字元和正規表達式

/love$/

雖然其他行也有love這個詞,但如果它不在行尾、就不會被搜尋到

6. 範圍比對[ ]和排除範圍比對符[^],使用方式如下:

[a-Z] (等同于[a-z A-Z])

/[Ll]ove/

[0-9]

[^a-Z]

7. 詞首\<、詞尾比對符\>:

搜尋以eth0四個字元開頭的文本:

grep -rl "\<eth0" *

《Linux指令、編輯器與Shell程式設計》讀書筆記3-linux指令中的特殊字元和正規表達式

*這裡注意和^$差別

搜尋以love結尾的文本:

grep -rl /love\>/ *

搜尋包含整個單詞the的文本:

grep -rl /\<dropped\>/ *

8. 重複次數比對符 X\{\}

搜尋目前檔案夾下字母r出現2次的文本:

grep -rl "r\{2\}" *

搜尋目前檔案夾下字母r至少出現2次的文本:

grep -rl "r\{2,\}" *

搜尋目前檔案夾下字母r出現2至10次的文本:

grep -rl "r\{2,10\}" *

搜尋目前檔案夾下單詞Link至少出現1次的文本:

grep -rl "Link\{1,\}" *

9. 正規表達式舉例:

搜尋包含IP位址的檔案:

grep -rl "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" *

繼續閱讀