1. 程式人生 > >SHELL訓練營--day4--正則1

SHELL訓練營--day4--正則1

正則及正則的意義

有這樣一個文字檔案,我們需要從裡面查詢 資訊時,需要怎麼處理呢?
一行行看麼,有計算機,可以讓計算機幫助我們查詢。
計算機如何查詢?如何匹配?這裡就涉及到匹配規則,這種規則 ,我們可以稱之為正規。
正則表示式(Regular Expression)是一種匹配模式,描述的是一串文字的特徵。
在linux中,我們可以用 grep/awk/sed 呼叫正則表示式,來查詢相關資訊。
一般情況下,是對行進行查詢匹配並進行處理的。
為什麼 這樣?如果直接對檔案進行處理,我們考慮這樣的情況 ,檔案小時,可以直接載入到記憶體。那麼當檔案 有幾百M,幾個G等,很大時,能直接放入麼?如果對檔案 進行修改,怎麼增刪改?所以將檔案分為更小的部分,以行為單位。便於處理輸出。


grep 命令

> global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來.
> grep 主要是用來搜尋檔案資訊。
> 語法大致是這樣: 【grep 引數 ‘匹配字元’  匹配檔案】。grep  'root'  /etc/passwd
> 引數說明:
> “-c”: count 統計匹配的行數。
> "-i" : 匹配條件忽略字元的大小寫。
> "-n”: 列印匹配資訊時,輸出所在行號。
> “-v”:  取反的意思,打印出不合規則的行。
> “-A","-B","-C":列印匹配資訊相鄰的行。A=after,B=before,C=centre.
> "-q": 邏輯判斷的意思,常和if 一起使用。如:`if  grep -q hello a.txt ; then echo yes;else echo no; fi `
> "-r": 遞迴查詢,查詢 **目錄** 下檔案是否有匹配到資訊。如:`grep -r "root" /etc/`
  • linux下文字行的相關資訊

    儲存的是以”\n“為行結尾。在做匹配資訊時,以"^"表示行的開始,以”$“表示行結束。
    如 匹配以 # 開頭時,可以這樣寫匹配資訊:"^#"。
    匹配以"good."結束時,這樣寫:”good.$“
    表示空行時,”^$“。
    這裡涉及到行中有”^“或是”$“時,寫法。

    [[email protected] ~]# cat 1.txt
    good.
    nice. good
    hello
    good.$helo
    [[email protected] ~]# grep -n "good.$" 1.txt
    1:good.
    [[email protected]
    ~]# grep -n "good.\\$" 1.txt 4:good.$helo
  • 字串匹配
    grep -n "root"  /etc/passwd
    grep -vn "nologin"  /etc/passwd
    grep -n '^\(root|bin\)' /etc/passwd
  • 字元匹配
    grep  [0-9]  /etc/passwd
    grep  [^0-9]  /etc/passwd
    grep  "^root[a-z]*$'  /etc/passwd
    grep  "^[rb]"  /etc/passwd
    grep  "[^r]oo"  /etc/passwd
    grep  '^$'  /etc/passwd
    grep  '[^a-zA-Z]'  /etc/passwd
  • 模糊字串匹配
    grep 'r..t' /etc/passwd
    grep 'oo*' /etc/passwd              #“*”表示零個或多個前面的字元,oo*表示o, oo, ooo.....
    grep '.*' /etc/passwd |wc -l          # ‘.*’表示零個或多個任意字元,空行也包含在內
    grep 'o\{2\}' /etc/passwd
  • grep擴充套件命令,egrep
    egrep 'o+' 1.txt               # 表示1個或1個以上前面字元
    egrep 'o?' 1.txt               # 表示0個或者1個前面字元
    egrep 'roo|body' 1.txt     # 匹配roo或者匹配body
    egrep 'r(oo)|(at)o' 1.txt   # 用括號表示一個整體
    egrep '(oo)+' 1.txt          # 表示1個或者多個 'oo' 

    . * + ? 總結
    . 表示任意一個字元(包括特殊字元)

    • 表示零個或多個*前面的字元
      .* 表示任意個任意字元(包含空行)
      + 表示1個或多個+前面的字元
      ? 表示0個或1個?前面的字元
      其中,+ ? grep不支援,egrep才支援。

sed

sed: stream editor for filtering and transforming text 使用者過濾和轉換文字的流編輯器
sed 主要是用來實現查詢 替換功能。
命令格式:“sed [option] 'sed command' filename”

  • option 引數說明

    -n :只打印模式匹配的行
    -e :直接在命令列模式上進行sed動作編輯,此為預設選項
    -r :支援擴充套件表示式
    -i :直接修改檔案內容