一、linux文本查找命令
三個基本常用的命令
1、grep:最早的文本匹配程序,使用POSIX定義的基本正則表達式(BRE)來匹配文本
2、egrep:擴展式grep,其使用擴展式正則表達式(ERE)來匹配文本
3、fgrep:快速grep,這個版本匹配固定字符串而非正則表達式。
二、grep的基本語法
GREP [options … ] pattern-spec [files…]
用途:匹配一個或多個模式的文本行
options:
-E:使用擴展正則表達式進行匹配
-i:忽略大小寫
--color 加以顏色可以添加別名
laias gerp ='grep --color'
-v:反向顯示,沒有被模式匹配到的行
-o:只顯示被模式匹配到的字符串
-A(後面加數字):找到行顯示行後面的n行
grep -A 2 '^core id ' /prp/cpuinfo
-B(後面加數字):找到行顯示前面的n行
grep -B 2 '^core id ' /prp/cpuinfo
-C(後面加數字):找到行的前後n行
grep -C 2 '^core id ' /prp/cpuinfo
三、簡單介紹
組成部分:一般字符:沒有特殊意義的字符
特殊字符:也稱meta字符,元字符,在正則表達式中有特殊的意義
常見的元字符:
\ :通常用於打開或者關閉後續字符的特殊含義,如\(…\)與\{…\}
. :匹配任意單個字符(除NUL)
* : 匹配前面的字符任意次
.* :任意長度的任意字符 例如: a.*b: 以字母a開頭
[] :匹配指定範圍內任意單個字符
[^] :匹配指定範圍外的任意字符
\? :匹配前面的字符0次或者1次
\{…\} :匹配前面的字符1次或者0次
例如: \{0,1\} 匹配一次
grep 'a\{2,3\}' aa.txt
grep 'a.\{2,3\}' aa.txt
egrep:
+ : 匹配前面的正則表達式1個或者多個擴張
| :匹配|前或者後的正則表達式
( ):匹配方刮號起來的正則表達式羣 ([])
位置錨定:
^ :錨定行首,此字符後面的任意內容必須出現在行首
$:錨定行尾,此字符前面的任意字符必須出現在行尾
^$:空白行
\<:其後面的任意字符必須作爲單詞首部出現
\>:其前面的任意字符必須作爲單詞的尾部出現
\<root\>
實例: grep '\<root' aa.ttx grep 'root\>' aa.ttx grep '\<root\>' aa.ttx
分組:\(\)
\(ab\)* 匹配ab
向後引用
\1:引用第一個左刮號以及與之對應的右刮號內的所有內容
\2:引用第二個左刮號以及與之對應的右刮號內的所有內容
\3:引用第三個左刮號以及與之對應的右刮號內的所有內容
\4:引用第四個左刮號以及與之對應的右刮號內的所有內容
實例:grep '\([0-9]).*\1$' aa.txt
四、grep\egrep\fgrep 之間的關係
grep:在沒有參數的情況下,只輸出符合RE字符串之句子,常見的參數在“一”中
egrep:爲grep的擴充版,改良了許多傳統的grep不能或者不便的操作;such as:
--- grep 之下不支持?與+這兩種字符,但是egerp可以得
--- grep 不支持a|b 或則 (abc | xyz) 這類“或一”比對,但是egerp可以
--- grep 在處理{n,m}時,需要{與}處理,但egrep不需要
五、字符集
[:alnum:] 數字字符 [:digit:] 數字字符 [:punct:] 標點符合字符 [:alpha:] 字母字符
[:graph:] 非空字符 [:space:] 空格字符 [:blank:] 空格與定位字符 [:lower:] 小寫字母
[:upper:] 大寫字符 [:cntrl:] 控制字符 [:print:] 可顯示的字符 [:xdigit:] 16進制數字
六、實例
1、 grep 'h.\{0,4\}p$' a:匹配a文件中任意字符至少0次之多4次
2、 grep 'h.\{1\}p$' a :匹配a文件中任意字符1次
3、 grep 'h.\{1,\}p$' a :匹配a文件中任意字符至少1次
4、 grep -o -E'[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' grub.cfg 搜索IP地址
5、 grep --color -E'C|cat' a.txt
6、 ls | grep '[[^[:space:]]*[0-9]' 顯示以數字結尾但是不包含空白的文件。
7、關於grep和egrep
如下通過常用實例來學習BRE和ERE匹配,源文件url.txt內容如下:
baidu.com
baidu
匹配以http或者https開頭,並且其後爲:並且含有.的串
BRE匹配:
grep '^https\{0,1\}.*\..*' url.txt
ERE匹配:
grep -E '^https?.*\..*' url.txt
匹配結果如下: