謝煙客---------Linux之文本處理三劍客之grep
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