Linux文本處理三劍客之grep

一、Linux文本處理三劍客

linux上主要處理文件的工具主要有grep家族(grep,egrep,fgrep)、awk、sed

        grep:文本搜索工具;根據給定的”pattern“對文本進行搜索

        sed:主要是以行爲單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作

        awk:是一個強大的文本分析工具


二、文本查找工具grep

grep:(Globally search a Regular Expression and Print);

            作用:文本搜索工具,根據用戶所指定的pattern(過濾條件)對目標文本逐行進行匹配查;                打印出符合條件的行;grep支持正則表達式,正則表達式一般趨向於最大長度匹配,也就是                所謂的貪婪模式。


正則表達式:Regular Expression

        正則表達式就是處理字符串的方法,它是以行爲單位來進行字符串的處理行爲,可以讓用戶輕易達     到查找、刪除、替換某特定字符串的處理程序


分類:

        基本正則表達式:BRE Basic Regular Expression   

        擴展正則表達式:ERE  Expand Regular Expression


grep家族:

        grep:  支持使用基本正則表達式

        egrep:支持使用擴展正則表達式

        fgrep:不支持使用正則表達式



二grep命令的主要參數:

    grep  [OPTIONS]  PATTERN  [FILE...]

PATTERN是過濾的條件,可以理解爲我們想要找到的內容。


常用選項:

--color=auto:對匹配到的文本着色後高亮顯示

[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'

    # alias是查看系統中的有哪些命令被替換了;如果不需要命令替換可以使用unalias NAME 刪除替換。


-i:忽略字符大小寫

[root@localhost ~]# grep "oot" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin


     # 可以看出只要包含pattern,也就是oot的行都會被匹配到,這一特性就是正則表達式的貪婪模式。


-o:僅顯示匹配 到的文本自身

[root@localhost ~]# grep -o "oot" /etc/passwd
oot
oot
oot
oot
oot
oot


    # -o選項列出所有匹配pattern中的內容,而不是行!


-v, --invert-match:反向匹配

[root@localhost ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[root@localhost ~]# grep -v "E" /etc/default/useradd 
# useradd defaults file
GROUP=100

    

-E:支持擴展的正則表達式

    # grep -e=egrep

-q, --quiet, --silient:靜默模式,不輸出任何信息

[root@localhost ~]# grep -q "O" /etc/default/useradd 
[root@localhost ~]# echo $?
0
[root@localhost ~]# grep -q "OOO" /etc/default/useradd 
[root@localhost ~]# echo $?
1

 # grep 靜默模式不會有信息打印到屏幕上,但是我們可以通過執行結果得知grep是否匹配到。通過echo "$?" 顯示出上個命令執行結果,0表示上條命令執行成功,1表示失敗。


-P  支持使用prel正則表達式

 

-e  PATTERN 進行多模式匹配

[root@localhost ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

grep -e "HO" -e "RO" /etc/default/useradd 
GROUP=100
HOME=/home

   


匹配上下文:

-A NUM 連同後面#行顯示 #爲非負整數

[root@localhost ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[root@localhost ~]# grep -A 2 "IN" /etc/default/useradd 
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash


-B NUM 連同前面#行顯示 #爲非負整數

[root@localhost ~]# grep -B 2 "IN" /etc/default/useradd 
GROUP=100
HOME=/home
INACTIVE=-1



-C NUM 連同前後#行一起顯示 #爲非負整數

[root@localhost ~]# grep -C 2 "IN" /etc/default/useradd 
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash


三、基本正則表達式 :

①字符匹配:

.:匹配任意單個字符

[root@localhost ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[root@localhost ~]# grep "M" /etc/default/useradd 
HOME=/home
CREATE_MAIL_SPOOL=yes

[root@localhost ~]# grep "M..L" /etc/default/useradd 
CREATE_MAIL_SPOOL=yes


[ ]:匹配範圍內的任意單個字符

[root@localhost ~]# grep "[MS]" /etc/default/useradd 
HOME=/home
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes


 ^ :匹配範圍外的任意單個字符

[root@localhost ~]# grep "^[MS]" /etc/default/useradd 
SHELL=/bin/bash
SKEL=/etc/skel

[:digit:]:所有數字

[root@localhost ~]# grep "[[:digit:]]" /etc/default/useradd 
GROUP=100
INACTIVE=-1

[:lower:]:所有小寫字母

[root@localhost ~]# grep "[[:lower:]]" /etc/default/useradd 
# useradd defaults file
HOME=/home
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[:upper:]:所有大寫字母

[root@localhost ~]# grep "[[:upper:]]" /etc/default/useradd 
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[:alpha:]:所有字母

[root@localhost mnt]# cat test
innode innode table innode table 
superblock  ext2 exr3
83 82 5400 7200

[root@localhost mnt]# grep "[[:alpha:]]" /mnt/test 
innode innode table innode table 
superblock  ext2 ext3

[:alnum:]:所有字母和數字

[root@localhost mnt]# grep "[[:alnum:]]" /mnt/test 
innode innode table innode table 
superblock  ext2 exr3
83 82 5400 7200

[:space:]:空白

[:blank:]:空格和TAB

[:punct:]:所有標點符號


②匹配次數: 非負整數

用限制其前面的字符要出現的次數;默認工作於貪婪模式(只要找到符合的內容整行顯示出來);

*:匹配前面的字符任意N次  

[root@localhost mnt]# cat test3
c
abcd
acccd
bccca

[root@localhost mnt]# cat test3
c
abcd
acccd
bccca


  #前面的字符可以0次,1次....N次


\+:匹配前面的字符至少1次

[root@localhost mnt]# grep "d\+" /mnt/test3
abcd
acccd


\?:匹配前面的0次或1次

[root@localhost mnt]# grep "d\?" /mnt/test3
c
abcd
acccd
bccca

\{m\}:其前面的字符出現m次

[root@localhost mnt]# grep "c\{3\}" /mnt/test3
acccd
bccca

\{m,n\}:其前面的字符出現m-n次 [m,n]

[root@localhost mnt]# grep "c\{1,3\}" /mnt/test3
c
abcd
acccd
bccca

\{0,n\}:出現0-n次

[root@localhost mnt]# grep "c\{0\}d" /mnt/test3
abcd
acccd

\{m,\}:至少出現m次

[root@localhost mnt]# grep "c\{3,\}d" /mnt/test3
acccd


③位置錨定

用來限制所匹配到的文本所出現在目標文本的位置。

^:行首錨定;用於模式的最左側,^PATTERN

[root@localhost mnt]# tail -6  /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
tom:x:1000:1000:mageedu:/home/mageedu:/bin/bash

[root@localhost mnt]# tail -6  /etc/passwd | grep "^n"
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin


$:行尾錨定;用於模式的最右側,PATTERN$

[root@localhost mnt]# tail -6  /etc/passwd | grep "n$"
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin


^PATTERN$:要讓PATTERN完全匹配一整行

[root@localhost mnt]# cat  test4
root 
root 123
root1234

[root@localhost mnt]# grep "^root1234$" test4
root1234

^$:空行

[root@localhost mnt]# cat /etc/issue 
\S
Kernel \r on an \m 

Welcome

[root@localhost mnt]# grep -v "^$" /etc/issue 
\S
Kernel \r on an \m 
Welcome

    # -v用來匹配pattern以外的內容 用來顯示出空行 ,配合wc可以計算空白行的數量


^[[:space:]]*$ 用於使用^$查找不到空白行的情況  

[root@localhost mnt]# cat  test4
root
 
root 123
                                     
root1234

[root@localhost mnt]# grep "^$"  /mnt/test4 |wc -l
0

[root@localhost mnt]# grep "^[[:space:]]*$"  /mnt/test4 |wc -l
2

\<或\b:詞首錨定,用於限制匹配單詞左側,\<PATTERN, \bPATTERN

[root@localhost mnt]# grep "\<c" /etc/passwd
colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin
chrony:x:993:990::/var/lib/chrony:/sbin/nologin

\>或\b:詞尾錨定,用於限制匹配單詞右側,PATTERN\>, PATTERN\b

[root@localhost mnt]# grep "S\>" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

\<PATTERN\>:單詞錨定,精確匹配整個單詞

[root@localhost mnt]# grep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

④分組與引用:

\(PATTERN\):將此PATTERN匹配到的字符當作一個整體,分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中

可以理解爲一個括號對應一個變量,變量爲$1,$2,$3.....


pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)

\1: \(pat2\)pat3\(pat4\(pat5\)pat6\)匹配到的結果

\2:\(pat4\(pat5\)pat6\)匹配到的結果

....

[root@localhost mnt]# grep "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt


四、文本查找工具egrep :

支持使用擴展正則表達式的grep命令,相當於grep -E;使用的方法和grep基本上沒什麼不同,\除了詞首錨定和詞尾錨定都可以去除。

egrep [OPTIONS] PATTERN [FILE...]


①字符匹配:

.:匹配任意單個字符

[ ]:匹配範圍內的任意單個字符

[^ ]:匹配範圍外的任意單個字符


[:digit:]:數字

[:lower:]:所有小寫字母

[:upper:]:所有大寫字母

[:alpha:]:所有字母

[:alnum:]:所有字母和數字

[:space:]:空白

[:blank:]:空格和TAB

[:punct:]:所有標點符號


②匹配次數:

用限制其前面的字符要出現的次數;默認工作於貪婪模式(只要找到符合的內容整行顯示出來)

 

*:匹配前面的字符任意次(0+∞)

 

+:匹配前面的字符至少1

 

?:匹配前面的0次或1

 

{m}:其前面的字符出現m次,m爲非負整數

 

{m,}:其前面的字符出現m次,m爲非負整數[m,n]

 

③位置錨定

用來限制模式所匹配到的文本只能出現於目標文本的位置

 

^:行首錨定;用於模式的最左側,^PATTERN


$:行尾錨定;用於模式的最右側,PATTERN$


^PATTERN$:要讓PATTERN完全匹配一整行


^$:空行


^[[:space:]]*$

 

\<\b:詞首錨定,用於限定單詞的左側,\<PATTERN, \bPATTERN

 

\>\b:詞尾錨定,用於限定單詞的右側,PATTERN\>, PATTERN\b

 

\<PATTERN\>:單詞錨定,精確匹配整個單詞

 

④分組與引用:

(PATTERN):將此PATTERN匹配到的字符當作一個整體,分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中

可以理解爲一個括號對應一個變量,變量爲$1$2$3.....



a|b:a或者b

C|cat:表示C或cat

(C|c)at:表示Cat或cat


這裏就用之前grep的例子作爲比較

1.分組中\可以去掉

[root@localhost mnt]# egrep "^([[:alnum:]]{1,})\>.*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

2.詞首詞尾的錨定\不能去掉

[root@localhost mnt]# egrep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3.查找UID大於1000的數字

[root@localhost mnt]# egrep -v "\<([0-9]|[1-9][0-9]|[1-9][0-9][0-9])\>" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章