1. 程式人生 > >shell 中使用grep 來判斷

shell 中使用grep 來判斷

在shell中,經常會用到grep 檢索某個檔案,查詢是否有字元匹配, 用來判斷流程:

如:查詢打印出來的log中,是否有想要的字串:

  1. /usr/app/startup > /usr/config.log  
  2. grep "NETMASK" /usr/config.log  
  3. if [ $? -ne 0 ]; then  
  4.         sleep 70  
  5.         echo "sleep 70s"
  6.         /usr/app/startup > /usr/config.log  
  7.         insmod /mnt/syslib/modules/fecdev.ko  
  8.         /usr/app/slm &  
  9.         /usr/app/softupdate slm &  
  10. else
  11.         echo "ipconfig succeed"
  12.         insmod /mnt/syslib/modules/fecdev.ko  
  13.         /usr/app/slm &  
  14.         /usr/app/softupdate slm &  
  15. fi  

這裡用到了grep操作的返回值:

如果有匹配的字串,返回值是0, 還會打印出匹配字串的行。

如果沒有匹配, 會返回1。

busybox的 grep和 ubuntu PC 的grep 引數還不一樣:

這裡列了busybox中的grep的使用規則:


grep
1.作用
grep命令可以指定檔案中搜索特定的內容,並將含有這些內容的行標準輸出。grep全稱是Global Regular ExpressionPrint,表示全域性正則表示式版本,它的使用許可權是所有使用者。
2.格式
grep [options]
3.主要引數
[options]主要引數:
-c:只輸出匹配行的計數。
-I:不區分大小寫(只適用於單字元)。
-h:查詢多檔案時不顯示檔名。
-l:查詢多檔案時只輸出包含匹配字元的檔名。
-n:顯示匹配行及行號。
-s:不顯示不存在或無匹配文字的錯誤資訊。
-v:顯示不包含匹配文字的所有行。
pattern正則表示式主要引數:
\:忽略正則表示式中特殊字元的原有含義。
^:匹配正則表示式的開始行。
$: 匹配正則表示式的結束行。
\:到匹配正則表示式的行結束。
[ ]:單個字元,如[A]即A符合要求 。
[ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的單個字元。
* :有字元,長度可以為0。
正則表示式是Linux/Unix系統中非常重要的概念。正則表示式(也稱為“regex”或“regexp”)是一個可以描述一類字串的模式(Pattern)。如果一個字串可以用某個正則表示式來描述,我們就說這個字元和該正則表示式匹配(Match)。這和DOS中使用者可以使用萬用字元
“*”代表任意字元類似。在Linux系統上,正則表示式通常被用來查詢文字的模式,以及對文字執行“搜尋-替換”操作和其它功能。
4.應用例項
查詢DNS服務是日常工作之一,這意味著要維護覆蓋不同網路的大量IP地址。有時IP地址會超過2000個。如果要檢視nnn.nnn網路地址,但是卻忘了第二部分中的其餘部分,只知到有兩個句點,例如nnn nn..。要抽取其中所有nnn.nnn IP地址,使用[0-9 ]\{3
\}\.[0-0\{3\}\。含義是任意數字出現3次,後跟句點,接著是任意數字出現3次,後跟句點。
$grep ’[0-9]\{3 \}\.[0-0\{3\}\’ipfile
補充說明,grep家族還包括fgrep和egrep。fgrep是fix grep,允許查詢字串而不是一個模式;egrep是擴充套件grep,支援基本及擴充套件的正則表示式,但不支援\q模式範圍的應用及與之相對應的一些更加規範的模式。

egrep:
為 grep 的擴充版本, 改良了許多傳統 grep 不能或不便的操作. 比方說:
- grep 之下不支援 ? 與 + 這兩種 modifier, 但 egrep 則可.
- grep 不支援 a|b 或 (abc|xyz) 這類"或一"比對, 但 egrep 則可.
- grep 在處理 {n,m} 時, 需用 \{ 與 \} 處理, 但 egrep 則不需.
諸如此類的... 我個人會建議能用 egrep 就不用 grep 啦... ^_^

egrep:
為 grep 的擴充版本, 改良了許多傳統 grep 不能或不便的操作. 比方說:
- grep 之下不支援 ? 與 + 這兩種 modifier, 但 egrep 則可.
- grep 不支援 a|b 或 (abc|xyz) 這類"或一"比對, 但 egrep 則可.
- grep 在處理 {n,m} 時, 需用 \{ 與 \} 處理, 但 egrep 則不需.
諸如此類的... 我個人會建議能用 egrep 就不用 grep 啦... ^_^