https://yq.aliyun.com/articles/557814
概要
-
作爲linux中最爲常用的三大文本(awk,sed,grep)處理工具之一,掌握好其用法是很有必要的。
-
首先談一下grep命令的常用格式爲:
grep [選項] ”模式“ [文件]
-
grep家族總共有三個:grep,egrep,fgrep。
常用選項
-E
:開啓拓展的正則表達-i
:忽略大小寫-v
:反過來,只打印沒有匹配的-n
:打印行號-w
:匹配的需要是整個單詞,即like
匹配like
不能是Liker
-c
:顯示總共多少行匹配-o
:只顯示被模式匹配到的字符串--color
:高亮匹配內容-A n
:顯示匹配到的字符串所在的行及其後n行,after-B n
:顯示匹配到的字符串所在的行及其前n行,before-C n
:顯示前後各n行,context
測試文本:/etc/passwd是一個文件
- 實驗
模式部分
fgrep
- 輸入要匹配的字符串,可以用fgrep(fast grep)代替來提高查找速度,如我們要匹配
hello.c
中的printf的個數:fgrep -c "printf" hello. c
\
使用正則
字符匹配
-
使用正則,這裏:
-
.
:任意一個字符。 -
[abc]
:表示匹配一個字符,這個字符必須是abc中的一個。 -
[a-zA-Z]
:表示匹配一個字符,這個字符必須是a-z或A-Z這52個字母中的一個。- -
[ ^123]
:匹配一個字符,這個字符是除了1、2、3以外的所有字符。
對於一些常用的字符集,系統做了定義:
[A-Za-z]
等價於[[:alpha:]]
[0-9]
等價於[[:digit:]]
[A-Za-z0-9]
等價於[[:alnum:]]
tab,space
等空白字符[[:space:]]
[A-Z]
等價於[[:upper:]]
[a-z]
等價於[[:lower:]]
- 標點符號
[[:punct:]]
匹配次數:
\{m,n\}
:匹配其前面出現的字符至少m次,至多n次。\?
:匹配其前面出現的內容0次或1次,等價於\{0,1\}
。*
:匹配其前面出現的內容任意次,等價於{0,}- 所以
".*"
表述任意字符任意次,即無論什麼內容全部匹配。
實驗:
- 找出
/
後接任意個字符,最後以sh
結尾的
- 找出以sh結尾的前面有2個以內任意字符的
位置錨定
^
:錨定行首$
:錨定行尾。技巧:"^$"用於匹配空白行。\b
或\<
:錨定單詞的詞首。如"\blike"不會匹配alike,但是會匹配liker\b
或\>
:錨定單詞的詞尾。如"\blike\b"不會匹配alike和liker,只會匹配like\B
:與\b作用相反。- 實驗:
分組及引用
\(string\)
:將string作爲一個整體方便後面引用\1
:引用第1個左括號及其對應的右括號所匹配的內容。\2
:引用第2個左括號及其對應的右括號所匹配的內容。\n
:引用第n個左括號及其對應的右括號所匹配的內容。
- 實驗:
- 以相同字母開始並結尾的行
- 以相同字母開始並結尾的單詞的行
- 匹配結尾字母到之前第一次出現該字母的字符:
- 以相同字母開始並結尾的行
擴展正則
擴展的(Extend)正則表達式(注意要使用擴展的正則表達式要加-E選項,或者直接使用egrep):
-
匹配字符:這部分和基本正則表達式一樣
-
匹配次數:
*
:和基本正則表達式一樣?
:基本正則表達式是?,二這裏沒有\。{m,n}
:相比基本正則表達式也是沒有了\。
-+
:匹配其前面的字符至少一次,相當於{1,}。
-
位置錨定:和基本正則表達式一樣。、
-
分組及引用:
(string)
:相比基本正則表達式也是沒有了\。\1
:引用部分和基本正則表達式一樣。\n
:引用部分和基本正則表達式一樣。
-
條件:
a|b
:匹配a或b -
所以說擴展正則就是 標準的正則應用在grep中嗎
匹配多個文件
- 如果要在當前目錄下所有. d o c文件中查找字符串“ s o r t”,方法如下:
grep "sort" *.doc
- 或在所有文件中查詢單詞“ sort it”
grep "sort it" *
子目錄中查找
grep -n "str" -r ./
:這是查找當前目錄下以及下轄子目錄下所有包含str字符串的文件,會列出文件名.以及該行的內容.以及行號- 在特定文件中grep某關鍵字,除了使用find 命令加exec選項之外,其實還有更簡單的方法:
grep -R --include="*.cpp" key dir
上述命令的含義:在dir
目錄下遞歸查找所有.cpp
文件中的關鍵字key