一、grep命令
- 命令解釋
grep, egrep, fgrep - print lines matching a pattern(打印和模式匹配的行)
基於用戶指定的“模式”,對目標文件逐行進行匹配檢查,打印匹配到的行,默認打印到終端窗口
其中,模式指的是:由正則表達式元字符所編寫出的過濾條件
- 命令語法
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…] - 命令選項
選 項 | 解 釋 |
---|---|
--color=auto | 高亮顯示匹配到的關鍵字 |
-i 或 --ignore-case | 忽略字符大小寫差別 |
-n 或 --line-number | 在顯示符合樣式的那一行之前,標示出改行的列數編號 |
-E 或 --extend-regexp | 將樣式爲延伸的正則表達式來使用 |
-w 或 --word-regexp | 只顯示全字符合的列 |
-o 或 --only-matching | 只顯示匹配PATTERN部分 |
-v 或 --revert-match | 顯示不包含匹配文本的所有行(反向匹配) |
-A<顯示行數> 或 --after-context=<顯示行數> | 除了顯示符合範本樣式的那一列之外,並顯示該行之後的內容。 |
-B<顯示行數> 或 --before-context=<顯示行數> | 除了顯示符合範本樣式的那一列之外,並顯示該行之前的內容。 |
-C<顯示行數> 或 --context=<顯示行數> | 除了顯示符合範本樣式的那一列之外,並顯示該行之前後的內容。 |
二、正則表達式
1、什麼是正則表達式?
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。它可以分爲兩類:基本正則表達式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)和 擴展正則表達式
2、正則表達式元字符
正則表達式元字符分爲四種:字符匹配,匹配次數,位置錨定、分組及引用。可以用它們來表示一些特殊的含義或功能。
Ⅰ、字符匹配
BRE | ERE | 描 述 |
---|---|---|
. | . | 匹配任意單個字符 |
[] | [] | 匹配指定範圍內任意單個字符 |
[^] | [^] | 匹配指定範圍外任意單個字符 |
在方括號( [] )中可以使用一些特殊匹配模式:
匹配模式 | 描 述 |
---|---|
[:upper:] | 所有大寫字母 |
[:lower:] | 所有小寫字母 |
[:alpha:] | 所有字母 |
[:digit:] | 所有數字 |
[:alnum:] | 所有字母和數字 |
[:space:] | 空白字符 |
[:punct:] | 所有標點符號 |
Ⅱ、匹配次數
tips:用在要指定出現次數的字符後面,用來限制前面字符的出現次數。
BRE | ERE | 描 述 |
---|---|---|
* | * | 匹配前面的字符任意次,包括0次(貪婪模式:儘可能長的匹配) |
.* | .* | 匹配任意長度的任意字符 |
\? | ? | 匹配前面的字符0或1次(至多1次) |
\+ | + | 匹配前面的字符至少一次 |
\{n\} | {n} | 匹配前面的字符n次 |
\{n,m\} | {n,m} | 匹配前面的字符至少n次,至多m次 |
\{,n\} | {,n} | 匹配前面的字符至多n次 |
\{n,\} | {n,} | 匹配前面的字符至少n次 |
Ⅲ、位置錨定
BRE | ERE | 描 述 |
---|---|---|
^ | ^ | 行首錨定,用於模式的最左側 |
$ | $ | 行尾錨定,用於模式的最右側 |
^PATTERN$ | ^PATTERN$ | 用於模式匹配整行 |
^$ | ^$ | 空行 |
^[[:space:]]*$ | ^[[:space:]]*$ | 空白行 |
\< 或 \b | < 或 \b | 詞首錨定,用於單詞模式的左側 |
\> 或 \b | > 或 \b | 詞尾錨定,用於單詞模式的最右側 |
\<PATTERN\> 或 \bPATTERN\b | <PATTERN> 或 \bPATTERN\b | 匹配整個單詞 |
Ⅳ、分組及引用
a、分組:
BRE | ERE | 描 述 |
---|---|---|
\(string\) |
(string) | 分組,將一個或多個字符捆綁在一起當作一個整體處理 |
聽着很抽象吧!下面給大家舉個栗子:
BRE | ERE | 含 意 |
---|---|---|
\(root\)\+ |
(root)+ | 匹配“root”至少一次 |
b、引用:
符 號 | 描 述 |
---|---|
\1 | 模式從左側起,第一個左括號與之匹配的右括號之間模式所匹配到的字符 |
\2 | 模式從左側起,第二個左括號與之匹配的右括號之間模式所匹配到的字符 |
… | … |
同樣也很抽象,栗子來了:
BRE | ERE |
---|---|
\(string1+\(string2\)*\) |
(string1+(string2)*) |
其中, \1:string1+(string2)*
\2:string2
小tips:講到這裏,大家也可以發現:基本正則表達式與擴展正則表達式類似,只是擴展正則表達式的表達上更簡單。正則表達式需要打"\(轉義符)"來表示某些字符的意思,而擴展正則表達式則不需要。同時大家也要知道 egrep 與 grep -E 執行效果相似,都是使用extended regular expression語法來解讀字符串的!
3、實例
1、顯示 /etc/passwd 文件中不以/bin/bash結尾的行;
[root@localhost ~]# grep -v "/bin/bash$" /etc/passwd
2、找出 /etc/passwd 文件中的兩位數或三位數;
[root@localhost ~]# grep --color=auto "[0-9]\{2,3\}" /etc/passwd
3、找出 /etc/c.d/rc.sysinit 文件中,至少一個空白字符開頭,且後面非空白字符的行;
[root@localhost ~]# grep -n "^[[:space:]]\{1,\}[^[:space:]]" /etc/rc.d/rc.sysinit
4、找出"netstat -tan"命令的結果中以"LISTEN"後跟0、1或多個空白字符結尾的行;
[root@localhost ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
5、這裏給出一段浪漫的文本:
He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
找出高亮顯示的單詞前後一致(同是love或like)的行;
150講輕鬆搞定Python網絡爬蟲