1. 程式人生 > >謝煙客---------Linux之文本處理三劍客之grep

謝煙客---------Linux之文本處理三劍客之grep

linux基礎

Linux之文本處理三劍客介紹

awk 名稱得自於它的創始人阿爾佛雷德·艾侯彼得·溫伯格布萊恩·柯林漢姓氏的首個字母,它具備了一個完整的語言所應具有的幾乎所有精美特性,AWK是一個解釋器,三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。Linux使用的是Gnu版本的AWK,gawk


grep 全稱"Global search REgular expression and Print out the line,以正規表示法進行全域查找以及打印" 由肯·湯普遜所寫,在大段文本中,按指定的過濾條件或過濾模式

, 根據用戶指定的"模式對目標文本逐行進行匹配檢查",把匹配到的行打印到屏幕上。


sed sream eidtor 行編輯器,也能實現文本過濾功能


grep

通配原理:grep程序依據,用戶給出的模式對標準輸入輸入的數據流逐個匹配檢測,並將匹配到的字符串以行的方式顯示到標準輸出

模式:PATTERN,由正則表達式字符文本字符所編寫的過濾條件,註意純文本字符用grep匹配也會調用正則表達式引擎,不如直接用fgrep

正則表達式字符:Regular Expression,簡寫regex,regexp,RE表示,由不表示字面意義的特殊字符表示,有“基本正則表達式字符”“擴展正則表達式字符


與grep相關的工具:

grep,支持基本正則表達式 BRE,Basic Regular Expression

egrep,支持擴展正則表達式 ERE,Extension Regular Expression

fgrep,不支持正則表達式 FRE Fast Regular Expression ,最為高效的精確匹配算法實現字符匹配


能夠調用正則表達式的工具:

grep,egrep,sed,awk,perl

1)正則表達式的元字符不同

2)各自調用不同的正則表達式引擎

3)各自實現的算法不一樣

4)perl支持較為強大的正則表達式引擎,一般寫程序需要用到正則表達式,都會調用perl的正則表達式,如果需要使用perl的正則表達式,需要在編譯時指明 --pcre,就能實現正則表達式解析和匹配檢查。



正則表達式引擎:把模式套到文本,檢查表達式匹配與否


grep命令

1、第一步,獲取命令的類型
[[email protected] ~]# type grep 
grep is aliased to `grep --color=auto‘
[[email protected] ~]# which --skip-alias grep
/usr/bin/grep
2、用外部命令獲取幫助的方法,獲取grep命令的幫助
[[email protected] ~]# grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
通過模式搜索每一個文本或標準輸入的數據,顯示由PATTERN匹配到的字串所在的行。
默認使用BRE匹配

Regexp selection and interpretation:
-E, --extended-regexp #ERE
-F, --fixed-strings   #FRE
-G, --basic-regexp    #BRE
-P, --perl-regexp     #PRE
-i, --ignore-case     #匹配時忽略PATTERN中字符大小寫

Miscellaneous:
 -v, --invert-match   #僅顯示不能夠PATTERN匹配到的行
 
Output control:
-n,--number           #顯示匹配到的行的行號
-c, --count           #顯示匹配到的行的行數
-o, --only-matching   #僅顯示匹配到的字符串
-q, --quiet, --silent #靜默模式

Context control:
-B, --before-context=NUM  #顯示匹配到的行及行前的NUM行
-A, --after-context=NUM   #顯示匹配到的行及行後的NUM行
-C, --context=NUM         #顯示匹配到的行及行前後各NUM行
--colour=auto             #將匹配到的文本高亮顯示


grep選項註釋

--colour=auto #將匹配到的文本高亮顯示

1、自動高亮顯示文本

技術分享

2、Rehl7系統自動添加別名,Rehl 6需要定義‘grep別名’方能簡化grep匹配時高亮顯示的過程

[[email protected] ~]# alias
alias egrep=‘egrep --color=auto‘
alias fgrep=‘fgrep --color=auto‘
alias grep=‘grep --color=auto‘


-v 不顯示被PATTERN匹配到的字符串所在的行,只顯示其他行

[[email protected] ~]# vim b.txt
a 1 b c
c 3 b c
d 10 c e
o 110 d f
l 2 f s
E 99 A D
A 77 D 1
SD 45 DF DF
MEI 66 AD OOO

1、顯示被PATTERN匹配到的字符串所在的行

技術分享

2、顯示模式不能匹配的行

技術分享


- q,quit 匹配到的內容不顯示到標準輸出,一般用於使用"命令的執行狀態結果"

1、如果gentoo用戶存在就顯示OK

[[email protected] ~]# who | grep -q ‘^gentoo\b‘ && echo ‘OK‘

*邏輯運算中:與運算:左側為真,才會繼續向後執行


-i 忽略PATTERN中特殊字符的大小寫

grep -i ‘how‘ a.txt

技術分享


-C,context 顯示匹配到的行及前後各NUM行

[[email protected] ~]# grep -C 2 -i ‘ipvs‘ /boot/config-3.10.0-514.6.2.el7.x86_64 
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m


-A,after 顯示匹配到的行及後NUM行

[[email protected] ~]# grep -A 2 ‘root‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
....


-B,before 顯示匹配到的行及前NUM行

[[email protected] ~]# grep -B 2 ‘root‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash #此處為首行,之前沒有,所以顯示不出來
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin


-o,only-match 僅顯示匹配到的字符串

# grep -o ‘root‘ /etc/passwd

技術分享


-n,number 顯示匹配到的行的行號

[[email protected] ~]# grep -n ‘root‘ /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
29:dockerroot:x:995:992:Docker User:/var/lib/docker:/sbin/nologin
41:hello:x:1008:1008::/root/hello:/bin/bash
42:hello1:x:1009:1009::/root/hello:/bin/bash
43:hello2:x:1010:1010::/root/hello:/bin/bash
47:vuser:x:994:990::/var/ftproot:/bin/bash
48:gentoo:x:1016:1016::/root/gentoo:/bin/bash
49:slackware:x:1017:1017::/root/slackware:/bin/tcsh
[[email protected] ~]# awk ‘/root/{print NR,$0}‘ /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
10 operator:x:11:0:operator:/root:/sbin/nologin
29 dockerroot:x:995:992:Docker User:/var/lib/docker:/sbin/nologin
41 hello:x:1008:1008::/root/hello:/bin/bash
42 hello1:x:1009:1009::/root/hello:/bin/bash
43 hello2:x:1010:1010::/root/hello:/bin/bash
47 vuser:x:994:990::/var/ftproot:/bin/bash
48 gentoo:x:1016:1016::/root/gentoo:/bin/bash
49 slackware:x:1017:1017::/root/slackware:/bin/tcsh


-c,count 顯示匹配到的行的行數,相當於, COMMAND | wc -l

[[email protected] ~]# grep -c ‘root‘ /etc/passwd 
9
[[email protected] ~]# grep  ‘root‘ /etc/passwd | wc -l
9

基本正則表達式字符

字符匹配

匹配次數

位置錨定


字符匹配

1) . 匹配任意單個字符, .. 匹配兩個字符

2)[] 匹配指定範圍內的任意單個字符 (同glob)

3)[^] 匹配範圍之外的任意單個字符 (同glob)


使用示例

[[email protected] ~]# vim a.txt #vim是一個文本編輯命令,進入後按i鍵,才可編寫文本,編寫完畢後。按esc鍵,再按shift 加 : 鍵,輸入wq加Enter鍵即可。
how are you?
hwo old are you?
HOW ARE YOU?
HWO OLD ARE YOU?
root:x:0:0:root:/root:/bin/bash

. 匹配任意單個字符

# grep ‘h.w‘ a.txt
# grep -i ‘h.w‘ a.txt #匹配時,不區分字符大小寫

技術分享

技術分享

.. 匹配兩個字符

# grep ‘r..t‘ a.txt

技術分享

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

1)匹配任意單個小寫字母

# grep ‘h[a-z]‘ a.txt  #glob通配時,為所有的字母
# grep ‘h[[:lower:]]‘ a.txt

技術分享

技術分享

2)匹配單個大寫字母

# grep ‘[A-Z]W‘ a.txt
# grep ‘[[:upper:]]W‘ a.txt

技術分享

技術分享

3)匹配aeioU範圍內任意單個字符

# grep ‘[aeioU]‘ a.txt
# grep -i ‘[aeioU]‘ a.txt

技術分享

技術分享


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

# grep ‘[^a-z]‘ a.txt
# grep ‘[^a-zE]‘ a.txt

技術分享

技術分享


匹配任意3個字符後跟t

# grep ‘...t‘ a.txt

技術分享

匹配任意3個字母後跟t

# grep ‘[[:alpha:]][[:alpha:]][[:alpha:]]t‘ a.txt
# grep ‘[a-zA-Z]‘ a.txt

技術分享


匹配次數前面的單個字符出現的次數‘

1)* 匹配前面單個字符出現0、1或多次

2)\? 匹配前面單個字符出現0次或1次

3)\+ 匹配前面的字符‘至少1次‘,>=1次

4) \{m\} 精確匹配前面單個字符m次

5)\{m,n\} 匹配前面單個字符至少m次,至多n次


使用示例

[[email protected] ~]# vim output_delimiter.txt
ab
cb
a12b
aab
abb
abababababababab

1)* 匹配前面單個字符出現0、1或多次

# grep ‘a*b‘ output_delimiter.txt  #你說:“cb能匹配到嗎?”

2)\? 匹配前面單個字符出現0次或1次

# grep ‘a\?b‘ output_delimiter.txt

技術分享

3) \+匹配前面單個字符‘至少1次‘

# grep ‘a\+b‘ output_delimiter.txt

技術分享

4)\{m\} 精確匹配前面單個字符m次

# grep ‘a\{2\}b‘ output_delimiter.txt

技術分享

5)\{m,n\} 匹配前面單個字符至少m次,至多n次;

# grep ‘a\{1,2\}b‘ output_delimiter.txt

技術分享

5.1)m=0時,匹配前面的單個字符至多n次

# echo -e ‘aaaaaaaaaaaab\naaab\naaab‘ >> output_delimiter.txt
# grep ‘a\{0,3\}b‘ output_delimiter.txt

技術分享

5.2)n=時,匹配前面的單個字符至少m次

# grep ‘a\{1,\}b‘ output_delimiter.txt

技術分享


位置錨定 期望匹配的字符必須出現在某個位置

1)^ 行首錨定,用於模式最左側。由正則表達式所匹配到的字串符必須出現在行首

2)$ 行尾錨定,用於模式最右側。由正則表達式所匹配到的字串符必須出現在行尾

3)^pattern$: 整行只能匹配此模式

4)匹配空白行: ^[[:space:]]*$ 空白可有任意次數

5)\< 或 \b 詞首錨定,用於單詞模式的左側

6)\> 或 \b 詞尾錨定,用於單詞模式的右側

7) \<PATTERN\> 或 \bPATTERN\b 匹配整個單詞,用於單詞左右兩側

8)分組


使用示例

# useradd rooter
# useradd rootor

1)^ 行首錨定,用於模式最左側。由正則表達式所匹配到的字串符必須出現在行首

# grep ‘^root‘ /etc/passwd

技術分享

2)$ 行尾錨定,用於模式最右側。由正則表達式所匹配到的字串符必須出現在行尾

# grep ‘bash$‘ /etc/passwd

技術分享

3)^pattern$: 整行只能匹配此模式

# vim c.txt
[[email protected] ~]# cat -n c.txt
     1	
     2	
     3	
     4	  
     5	
[[email protected] ~]# grep -n ‘^$‘ c.txt 
1:
2:
3:

4)匹配空白行: ^[[:space:]]*$ 空白可有任意次數

[[email protected] ~]# grep -n ‘^[[:space:]]*‘ c.txt
1:
2:
3:
4:  
5:  
[[email protected] ~]# grep -c ‘^[[:space:]]*‘ c.txt
5

5)\< 或 \b 詞首錨定,用於單詞模式的左側

# grep ‘\broot‘ /etc/passwd

技術分享

6)\> 或 \b 詞尾錨定,用於單詞模式的右側

# grep ‘root\b‘ /etc/passwd

技術分享

7) \<PATTERN\> 或 \bPATTERN\b 匹配整個單詞,用於單詞左右兩側

# grep ‘\broot\b‘ /etc/passwd

技術分享

8)分組: \(\) 將任意個字符當前同一個組件

# cat grep.txt 
abxy
xxxxxxy
xyxyxyxyabcxy
# grep ‘\(xy\)\+‘ grep.txt

技術分享

9)後向引用:分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式為:\1,\2,\3

\1:從PATTERN左側起,第一個左括號與與之對應的右括號之間的模式匹配到的字符

\(ab+\(xy\)*\)

\1: ab+\(xy\)* 模式所匹配到的內容

\2: xy 模式所匹配到的內容

# grep ‘^\([[:alnum:]]\+\).*\1$‘ /etc/passwd

技術分享

本文出自 “Reading” 博客,請務必保留此出處http://sonlich.blog.51cto.com/12825953/1952467

謝煙客---------Linux之文本處理三劍客之grep