1. 程式人生 > >正則表達式grep的一些操作

正則表達式grep的一些操作

正則表達式中grep系的操作

在我們進行編輯的時候,我們會用到vim和nano這樣的的全屏編輯器,這樣的編輯器顧名思義會占據我們的屏幕,來進行編輯。當然,有全屏的編輯器,就有不是全屏的文本編輯器,叫做行編輯器,對於行編輯器來說,有行編輯器三劍客,grep系,sed,awk。
這篇主要就來寫grep系的編輯器的一些操作。


greb系:grep,egrep,fgrep,文本搜索工具;基於PATTERN(模式)對於給定的文本文件進行模糊搜索,grep系所有命令默認工作於貪婪搜索模式;


grep系:
grep:Global search Regular Expression and Print out the line

利用正則表達式進行全局搜索並將匹配到的行顯示出來

格式:
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

PATTERN:過濾匹配條件,是由沒有特殊意義的文本字符或者是正則表達式元字符組成;

root作為PATTERN

[root@localhost ~]#  grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

正則表達式的元字符:會被正則表達式處理引擎解釋為特殊含義的字符;各自都有對應的含義,除非加上\進行轉義,否則會以原來的含義進行轉義解釋。

所有的正則表達式都是由普通字符加上元字符構成的,

pcre:正則表達式處理引擎(處理器),用prel語言的正則表達式引擎(處理器);

正則表達式元字符:

基本的正則表達式元字符:BRE
字符匹配類:
.:可以匹配任意單個字符

[root@localhost ~]# cat /tmp/test/b
aaabbbccc
abcabc
abcdefg
[root@localhost ~]# grep f. /tmp/test/b
abcdefg
[root@localhost ~]# grep .f /tmp/test/b
abcdefg

[]:可以匹配任意指定範圍內的單個字符;

[root@localhost ~]# grep [cd] /tmp/test/b
aaabbbccc
abcabc
abcdefg

[^]:可以匹配任意指定範圍以外的單個字符;

[root@localhost ~]# grep [^d] /tmp/test/b
aaabbbccc
abcabc
abcdefg

下列所有的字符集都可以放置於[]之中用於匹配字符集範圍內的單個字符;
[:lower:]:小寫字母
[:upper:]:大寫字母
[:alpha:]:大小寫字母
[:digit:]:十進制數字
[:xdigit:]:十六進制數字
[:alnum:]:所有的十進制數字加上字母
[:punct:]:所有的標點符號
[:space:]:所有的空白字符
[a-z]:僅表示所有的小寫字母
[A-Z]:僅表示的大寫字母
[0-9]:僅表示所有的十進制數碼

[root@localhost ~]# cat /tmp/test/b
aaabbbccc
abcabc
abcdefg
s
r
q
12312131231  
THIS   IS   A   "TEST"
  
[root@localhost ~]# grep [[:lower:]] /tmp/test/b
aaabbbccc
abcabc
abcdefg
s
r
q
[root@localhost ~]# grep [[:upper:]] /tmp/test/b
THIS   IS   A   "TEST"
[root@localhost ~]# grep [[:digit:]] /tmp/test/b
12312131231 
[root@localhost ~]# grep  [[:punct:]] /tmp/test/b
THIS   IS   A   "TEST"
[root@localhost ~]# grep  [[:space:]] /tmp/test/b
12312131231  
THIS   IS   A   "TEST"
[root@localhost ~]# grep  [1-3] /tmp/test/b
12312131231

次數匹配類:該類字符前面的一個字符可以出現的次數:
*:其前面的字符可以出現任意次,即:0次,1次或多次;
\?:其前面的字符可有可無,即:0次或1次;
\+:其前面的字符至少出現一次;
\{m,n\}:其前面的字符至少出現m次,最多出現n次;
\{m\}:其前面的字符必須出現m次;
\{m,\}:其前面的字符至少出現m次;
\{,n\}:其前面的字符出現最多不超過n次;

註意:在正則表達式中,表示任意長度的任意字符:.*

[root@localhost ~]# grep "cd*" /tmp/test/b
aaabbbccc
abcabc
abcdefg
[root@localhost ~]# grep "a\?b"  /tmp/test/b
aaabbbccc
abcabc
abcdefg
[root@localhost ~]# grep "a\+b"  /tmp/test/b
aaabbbccc
abcabc
abcdefg
[root@localhost ~]# grep "a\{1,3\}b" /tmp/test/b
aaabbbccc
abcabc
abcdefg
[root@localhost ~]# grep "a\{2\}b" /tmp/test/b
aaabbbccc
[root@localhost ~]# grep "a\{2,\}b" /tmp/test/b
aaabbbccc
[root@localhost ~]# grep "a\{,2\}b" /tmp/test/b
aaabbbccc
abcabc
abcdefg

位置錨定字符:
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b

[root@localhost ~]# grep "^a\{,2\}b" /tmp/test/b
abcabc
abcdefg
[root@localhost ~]# grep "c$" /tmp/test/b
aaabbbccc
abcabc
[root@localhost ~]# grep "\<T..S\>" /tmp/test/b
THIS   IS   A   "TEST"

分組與前向引用字符:
\(\):將小括號中包含的內容作為一個不可分割的整體來處理;
\1,\2,\3...:前向引用
正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中括選的內容,\2表示前面所出現的第二組小括號中括選的內容;...

\(string1\(string2\)\):\1表示string1,\2表示string2;
\(string1\).*\(string2\):\1表示string1,\2表示string2;

[root@localhost ~]# grep "\(root\).*\1" /etc/passwd
root:x:0:0:root:/root:/bin/bash

或者:
\|:將其左右的字符或字符串當做整體來對待;
"C\|cat" C cat

[root@localhost ~]# grep "\(root\).*\1" /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep "root\|ex" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ex:x:1000:1000:ex:/home/ex:/bin/bash


擴展的正則表達式元字符:ERE(所有的元字符不用轉義\符號,除了字首錨定和字尾錨定以外,其余的全部和上邊一樣。
字符匹配類:
.:可以匹配任意單個字符
[]:可以匹配任意指定範圍內的單個字符;
[^]:可以匹配任意指定範圍以外的單個字符;
下列所有的字符集都可以放置於[]之中用於匹配字符集範圍內的單個字符;
[:lower:]:小寫字母
[:upper:]:大寫字母
[:alpha:]:大小寫字母
[:digit:]:十進制數字
[:xdigit:]:十六進制數字
[:alnum:]:所有的十進制數字加上字母
[:punct:]:所有的標點符號
[:space:]:所有的空白字符
[a-z]:僅表示所有的小寫字母
[A-Z]:僅表示的大寫字母
[0-9]:僅表示所有的十進制數碼

次數匹配類:該類字符前面的一個字符可以出現的次數:
*:其前面的字符可以出現任意次,即:0次,1次或多次;
?:其前面的字符可有可無,即:0次或1次;
+:其前面的字符至少出現一次;
{m,n}:其前面的字符至少出現m次,最多出現n次;
{m}:其前面的字符必須出現m次;
{m,}:其前面的字符至少出現m次;
{,n}:其前面的字符出現最多不超過n次;

註意:在正則表達式中,表示任意長度的任意字符:.*

位置錨定字符:
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b



分組與前向引用字符:
():將小括號中包含的內容作為一個不可分割的整體來處理;
\1,\2,\3...:前向引用
正則表達式處理引擎的內置變量,1表示前面所出現的第一組小括號中括選的內容,2表示前面所出現的第二組小括號中括選的內容;...

(string1(string2)):1表示string1,2表示string2;
(string1).*(string2):1表示string1,2表示string2;

或者:
|:將其左右的字符或字符串當做整體來對待;
"C|cat" C cat


grep系:
grep:僅支持基本正則表達式元字符;
egrep:可以支持擴展正則表達式元字符;
fgrep:不支持任何形式的正則表達式元字符,將所有的字符當做沒有任何特殊意義的普通文本字符;


常用選項:
-A num:同時顯示被PATTREN匹配到的行及其後續num行;
-B num:同時顯示被PATTREN匹配到的行及其前面num行;
-C num:同時顯示被PATTREN匹配到的行及其前後num行;
--color[=when]:以高亮顏色顯示被匹配到的內容;默認命令就有

[root@localhost ~]# alias
alias cp=‘cp -i‘
alias egrep=‘egrep --color=auto‘
alias fgrep=‘fgrep --color=auto‘
alias grep=‘grep --color=auto‘
alias l.=‘ls -d .* --color=auto‘
alias ll=‘ls -l --color=auto‘
alias ls=‘ls --color=auto‘
alias mv=‘mv -i‘
alias rm=‘rm -i‘
alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘

-c,--count:不輸出被PATTREN匹配的行的內容,而是輸出被PATTERN匹配到的行數;
-E:可以是grep命令支持擴展正則表達式元字符;相當於執行egrep命令
-F:相當於fgrep;
-e:指定多個PATTERN在一個命令行中生效;
-f:將從指定的文件中讀取多個PATTERN用於一次搜索;
-i:忽略文件中字符大小寫
-o:僅顯示被PATTERN匹配到的部分,關閉貪婪模式;
-q:安靜模式;相當於 grep > /dev/null
-v:選擇沒有被PATTERN匹配到的行;


[root@localhost ~]# grep -A 1 "123" /tmp/test/b
12312131231  
THIS   IS   A   "TEST"
[root@localhost ~]# grep -B 1 "123" /tmp/test/b
q
12312131231
[root@localhost ~]# grep -C 1 "123" /tmp/test/b
q
12312131231  
THIS   IS   A   "TEST"
[root@localhost ~]# grep -c  "ab" /tmp/test/b
3
[root@localhost ~]# grep -e  "ab" -e "ef" /tmp/test/b
aaabbbccc
abcabc
abcdefg
[root@localhost ~]# grep -i "is" /tmp/test/b
THIS   IS   A   "TEST"
[root@localhost ~]# grep -o "IS" /tmp/test/b
IS
IS
[root@localhost ~]# grep -q "IS" /tmp/test/b
[root@localhost ~]# grep -v "IS" /tmp/test/b
aaabbbccc
abcabc
abcdefg
s
r
q
12312131231


正則表達式grep的一些操作