grep正則執行模式粗探

2021-05-22 18:50:23 字數 1250 閱讀 2639

今天群裡討論grep正則時,用到了-p選項

查了下man

-p, --perl-regexp

interpret pattern as a perl regular expression.

還是從main函式開始,跟蹤grep的函式呼叫過程

1:函式呼叫路徑

在grep.c的main函式裡,開始時,對引數(相當多)進行了分析(略)

然後呼叫正則編譯函式

然後分別對每個檔案,呼叫了grepfile函式,因此grep支援對多個檔案進行操作(包括標準輸入)

grepfile對檔案型別進行分析,然後呼叫grep函式

grep函式迴圈讀取(呼叫fillbuf)檔案匹配(呼叫grepbuf)

grepbuf裡,有個match_offset指標,用於指標從左到右的偏移匹配

可以看出grepbuf呼叫了execute函式指標

execute即是執行正則的函式

2:正則模式設定

execute函式採用指標的形式,是因為grep彩用了多種正則執行模式,用指標方便呼叫不同模式的正則匹配函式

execute函式指標在install_matcher函式裡賦值

這裡install_matcher就是在main裡分析不同引數是呼叫的,以指定採用哪種正則「matcher匹配器」?。

通過不同引數指定,並通過setmatcher函式指定matcher值

預設的matcher值是grep:

3:正則函式

正則在處理步驟上,大致可分成編譯和執行二個步驟:編譯正規表示式,執行正規表示式

上邊提到的函式指標

在install_matcher裡,設定了正則compile(編輯器?)與正則execute(執行器)

matchers陣列,結構陣列在search.c檔案裡指定

預設為gcompile和egexecute

這邊就是呼叫不同正規表示式編譯和解析函式了

以grep預設的gcompilte和egexecute為例

gcompilte事實上呼叫了dfa.c、dfa.h檔案裡的正則編譯函式dfacomp

而egexecute則是呼叫了正則查詢函式re_match,re_search

這二個函式在標準庫定義/usr/include/regex.h

而對於perl正則模式pcompile,pexecute則是呼叫了perl正則處理函式

這二個函式需要perl正則庫(pcre.h)支援

未了,對於正則具體的編譯和執行,待以後有空繼續研究

hadoop本地執行模式 官方Grep案例

一 在本地模式之前 1.先進入 hadoop所安裝的資料夾 儲存後退出 二 官方grep案例 建立在hadoop 2.7.2檔案下面建立乙個input資料夾 mkdir input將hadoop的xml配置檔案複製到input cp etc hadoop xml input 3.執行share目錄下...

grep正則表達

1 注意在ms的系統下生成的文字檔案,換行會加上乙個 m 字元。所以最後的字元會是隱藏的 m 在處理windows 下面的文字時要特別注意!可以用cat dos file tr d r unix file 來刪除 m符號。m r 2 表示它前面的串是在行的結尾,比如 表示 在一行的結尾 搜尋末尾是....

grep 的學習 正則

grep 命令 grep name path file name 從file name檔案中中查詢 name 字元 grep c name path file name 統計查詢到name 的總共的行數 grep n name path file name 統計查詢到name 的所在的行數 grep...