名稱
grep – 打印匹配的行
語法:
grep [option] pattern [file...] grep [option] [-e pattern] | -f file [file]
簡介
grep 就是從文件或者標準輸入中搜索你給的樣式,默認把匹配到的行打印下來。
除grep外,還有其他兩個程序可以用,egrep和fgrep。egrep等同于grep -E,frep等同于grep -F。直接使用egrep和fgrep的方法被丟棄了,提供這兩個命令時是為了和歷史版本相兼容。
選項(option)
--help 輸出幫助信息 -V ,--version 打印grep 的版本號
選擇匹配類型:(Macher Selection)
-E ,--extended-regexp , 模式是一個擴展正則表達式 -F ,--fixed-strings , 模式是一個由斷行符分隔的定長字符串 -G,--basic-regexp , 模式是基本正則表達式,默認就是這 -P,--perl-regexp , 模式是perl正則表達式
匹配控制:
-e pattern ,--regexp=pattern , 使用pattern作為匹配操作。指定多次匹配操作 -f file,--file=file 從文件中獲得匹配模式 -i ,--ignore-case 在輸入的文件和匹配模式中都忽略大小寫, -v,--invert-match 打印不匹配的行 -w,--word-regexp , 強制匹配僅完全匹配單詞, 單詞必須和匹配內容一樣才打印 -x,--line-regexp , 強制模式匹配一行,文件里面行的內容必須和匹配模式一樣才打印
[object Object] [object Object] [object Object] [object Object]
一般輸出控制:
-c,--count , 不輸出匹配的內容,僅僅打印匹配到的行數,和-v一塊使用,就是打印沒匹配的行數 --color[= WEHN], 帶顏色在終端打印匹配的內容,顏色通過環境變量GREP_COLORS定義, WEHN可以是never,auto,和always -L,--files-without-match 只顯示不匹配的文件名 -l,--files-with-match 只顯示匹配的文件名 -o ,--only-matching 打印僅僅匹配到的部分。 -q ,--quiet,--silent 安靜模式,不輸出任何內容,如果有匹配內容,退出狀態碼為0, -s ,--no-messages 不輸出錯誤信息。 更好的的做法是不使用-q和-s,而是重定向到/dev/null 中
輸出行前綴控制:
-b,--byte-offset 在輸出的每一行之前顯示包含字符串的行的文件中的字節偏移量,在這里是行偏移量 -H,--with-filename 打印每次匹配到的文件名,這是默認選項當很多文件要匹配時 -h ,--nofilename , 當只有一個文件匹配時,不打印文件名,這是默認選項。 -n,--line-number , 打印匹配到的行號
輸出上下文的行控制
-A num ,--after-context=NUM 打印匹配到行的后面NUM行,多次模式匹配中間以 -- 分隔 -B num ,--before-context=NUM 打印匹配的行之前的NUM行放一個行包含一個組分隔符 (--)在接下來的匹配組中。如果指定了-o選項,這個選項就沒有一樣了,同時會給一個警告 -C NUM,--context=NUM, 打印匹配行的上下NUM行
文件和目錄選擇:
-a,--text 加工二進制文件當成文本文件處理。這個選項等同于--binary-files=text --binary-files=TYPE -D ACTION ,--device=ACTION 如果輸入文件是一個設備文件,FIFO,或者套接字文件,使用ACTION處理它,默認的ACTION是讀,也就是說設備文件當成一般文件看待,如果ACTION是skip,設備文件會被跳過。 -d ACTION,--directores=ACTION 如果輸入文件是一個目錄 ,使用ACTION去處理這個目錄,默認的ACTION是讀,也就是把目錄當成一般文件來讀。如果ACTION是skip,目錄會被跳過, 如果ACTION是recurse,grep會遞歸的讀取所有的文件在每一個目錄下面 --exclude=GLOB 跳過文件匹配GLOB,文件名GLOB可以是*,?,和[..] ,也可以是\ 去引用一個通配符或者反斜杠字符 --exclude-from=FILE 跳過文件誰的名字匹配任何文件名GLOB的,從FILE中讀取GLOB的。和--exclude差不多 --exclude-dir=DIR 排除目錄匹配這樣式DIR從遞歸查詢中 -I 處理二進制文件,把二進制文件當做什么都沒有,直接跳過 --inlclude=GLOB 僅僅搜尋匹配GLOB的文件 -R,-r,--recursive 讀取所有在目錄下面的文件,這等價于-d recurse 選項
其它選項:
--line-buffered 使用行的緩存在輸出上,這個可能導致性能損失 --mmap 如果可能的話,使用mmap系統調用去讀取輸入,而不是read系統調用。這某些情況下,--mmap導致更好的性能。然而--mmap可能導致無法定義的行為,當一個文件shrinks當grep在操作的時候,或者IO錯誤發生 -U 把文件當成二進制文件來看,默認情況下,在DOS和windows操作系統下面,grep猜一個文件的類型通過查看文件的前32kB的內容。如果文件是文本,他去掉CR字符從原始文件。這個選項在其它平臺上沒有什么作用 -z ,--null-data 把輸入當做很多行,每一個終止通過一個NULL字節代替一個新航,就像-Z或者--null選項,這個選項就像sort -z 去加工隨機文件名
正則表達式
正則表達式是一個模式描述一套字符串。正則表達式就像數學表達式差不多,使用不同的操作符構成一個小的表達式 . 正則表達式幾乎匹配了所有的字符,數字和正則自己。一些特殊的元字符可以通過在前面加一個反斜杠實現引用。
grep理解三種不同版本的正則表達式語法:basic,extended和perl的。
字符類和括號類表達式:
. 匹配任何單個字符 [...] 匹配括號列表里面的單個字符在[]內表示范圍,可以在兩個字符之間加一個 - 代表范圍。 匹配任何單字符在兩個字符之間。默認的 [a-d]匹配[abcd] ,不過也可能匹配[aBbCcDd] ,為了獲得默認的括號表達式類型,你需要設置這LC_ALL環境變量。 為了匹配一些特殊字符: ] : 把它放在列表首部, []abcd] ^ :可以放在任何位置除了首部 [abc^d] - :放在最后的位置 [abcd-] [object Object]
另外有幾個預定義的括號表達式
[:alnum:]:表示數字與大小寫字母[0-9a-zA-Z] [:alpha:]:表示大小寫字母[a-zA-Z] [:cntr:]: 表示控制按鍵,Ctrl、Tab... [:digit:]:表示數字 [:graph:]:表示除了空白鍵與Tab鍵外的所有按鍵 [:lower:]:代表小寫字母 [:print:]:代表任何可以被打印出來的字節 [:punct:]:代表標點符號 [:space:]:代給空白鍵 [:upper:]:代表大寫字母 [:xdigit:]:代表十六進制的數字類型
錨定符
^:匹配行首 $:匹配行尾 \< 和 \> 匹配一個字符串的開始和結束 ,也就是牟定單詞。 \b 相當于\<或\> \B 不牟定,類似于\b取反 \w 等價于 [:alnum:] \W 等價于 [^[:alnum:]]
重復:
正則表達式可能重復幾次撇皮 ? 前面的字符是可選的和只匹配一次 * 前面的字符可以匹配0此或者更多次 + 前面的字符至少匹配一次,可以匹配更多次 {n} 前面的字符精確匹配 n 此 {n,}前面的字符匹配n此以上 {,m}前面的字符至多匹配m次 \(\):向后引用,引用:\1, \2, \3 [object Object] [object Object]
基本正則和擴展正則:
基本正則之間,元字符,?,+,{,|,(,}和)都丟失了他們特殊的意義,應該使用\?,\+,\{,\(,和、) 傳統egrep不支持{ 元字符,一些egrep實現了支持 \{ ,一些腳本應該避免 { 在grep -E 中應該使用 [{] 去匹配"{"
環境變量:grep的行為被一些環境變量影響。自己man吧。
總結:博文到這里結束吧。這篇博文,寫的不好,需要時間來不斷完善其中的實例。
為什么不好?
1、這種grep例子,都是老生常談,沒有一點點新意,盡管我花了好久時間,時間長不能代表做的好。
2、grep就只是一個命令,我去看manual手冊,一直在那翻譯,當然翻譯的不夠好,翻譯時好多句式不明白,明白單詞的意思,不一定能夠明白句子的意思。難道還要看源代碼,才能明白其中的原理嗎?目前會用就行了吧。
3、在這個平臺上面寫的第一篇博文,弄個圖片好久沒弄出來,最后我又撤銷了幾張圖片,都不知道為什么。
下次寫博客注意的地方?
1、不要照著manual手冊翻譯過來,那樣是個人都會翻譯,而是把自己對manual的理解,與整理之后貼出來,有自己的見解。
2、還要再熟悉熟悉博客平臺,才能用好。
原創文章,作者:艾賀,如若轉載,請注明出處:http://www.www58058.com/7720