今天群裡討論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...