您好,登錄后才能下訂單哦!
GNU/Linux中常用的文本處理工具有三種:
grep、egrep、fgrep:文本搜索工具;
sed:流編輯器、文本編輯工具;
awk:文本報(bào)告生成器;
今天主要來說一下grep和正則表達(dá)式;
一、概述
grep(Global search REgular expression and Print out the line.),是一個(gè)文本搜索工具;根據(jù)指定“pattern(過濾條件)”對目標(biāo)文本逐行進(jìn)行匹配檢查并打印出符合條件的行;
什么是正則表達(dá)式?
正則表達(dá)式:由一類特殊字符及文本字符所編寫的模式,有些字符不表示其字面意義,而是用于表示控制或通配的功能;
而正則表達(dá)式又分為兩類:
基本正則表達(dá)式:BRE
擴(kuò)展正則表達(dá)式:ERE
正則表達(dá)式引擎:利用正則表達(dá)式模式分析所給定的文本的程序。
grep家族:
grep:支持使用基本正則表達(dá)式,(也可以使用一個(gè)選項(xiàng)“-E”支持?jǐn)U展的正則表達(dá)式;到下面再說);
egrep:支持使用擴(kuò)展
正則表達(dá)式;
fgrep:不支持使用正則表達(dá)式;
grep命令
grep [選項(xiàng)] [模式] [FILE...]
常用選項(xiàng)示例:
-i:忽略字符大小寫;
[root@localhost~]# cat test.txt He love his lover. he like his lover. he love his liker. He like his liker. [root@localhost~]# grep -i "he" test.txt He lovehis lover. he likehis lover. he lovehis liker. He likehis liker.
-n:顯示行號;
[root@localhost ~]# grep -ni "he" test.txt 1:He love his lover. 2:he like his lover. 3:he love his liker. 4:He like his liker.
-o:僅顯示匹配到的文本自身;
[root@localhost ~]# grep "bash$" /etc/passwd root:x:0:0:root:/root:/bin/bash mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash gentoo:x:3003:3003::/home/gentoo:/bin/bash ubuntu:x:3004:4004::/home/ubuntu:/bin/bash mint:x:3100:3100::/home/mint:/bin/bash hadoop:x:3102:3102::/home/hadoop:/bin/bash hive:x:991:986::/home/hive:/bin/bash linxuejing:x:3103:3103::/home/linxuejing:/bin/bash [root@localhost ~]# grep -o "bash$" /etc/passwd bash bash bash bash bash bash bash bash 注:這里首先是顯示以bash結(jié)尾的行,然后加“-o”選項(xiàng)只顯示匹配到字符串本身;
-v:--invert-match:取反,反相匹配;
[root@localhost ~]# grep -v "bash$" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin ...... 注:顯示不是以“bash”結(jié)尾的行;
--color=auto:對匹配到的文本著色后高亮顯示(這里指的是CentOS 7);
# 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' 注:CentOS 5,6的話需要以alias grep='grep --color=auto'手動(dòng)來定義;
-q,--quiet:靜默模式,不輸出任何信息;
root@localhost ~]# grep -q "root"/etc/passwd [root@localhost ~]# echo $? 0 可使用“$?”來顯示上條命令的執(zhí)行狀態(tài)結(jié)果,“0”表示成功,有匹配到字符串;
-e PATTERN:多模式匹配;
[root@localhost~]# grep -e "r..t" -e "b..h" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin chrony:x:993:990::/var/lib/chrony:/sbin/nologin mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash gentoo:x:3003:3003::/home/gentoo:/bin/bash ubuntu:x:3004:4004::/home/ubuntu:/bin/bash mint:x:3100:3100::/home/mint:/bin/bash hadoop:x:3102:3102::/home/hadoop:/bin/bash hive:x:991:986::/home/hive:/bin/bash linxuejing:x:3103:3103::/home/linxuejing:/bin/bash
-f FILE:FILE為每行包含了一個(gè)pattern的文本文件,及grep script;
[root@localhost~]# vim grep.txt root bash
-A num:顯示匹配到的行的后n行;
[root@localhost ~]# grep -A 1"hadoop" /etc/passwd hadoop:x:3102:3102::/home/hadoop:/bin/bash hive:x:991:986::/home/hive:/bin/bash
-B num:顯示匹配到的行的前n行;
[root@localhost ~]# grep -B 1 "hadoop" /etc/passwd fedora:x:3101:3101::/home/fedora:/bin/csh hadoop:x:3102:3102::/home/hadoop:/bin/bash
-C num:顯示匹配到行的前后n行;
[root@localhost ~]# grep -C 2 "hadoop" /etc/passwd mint:x:3100:3100::/home/mint:/bin/bash fedora:x:3101:3101::/home/fedora:/bin/csh hadoop:x:3102:3102::/home/hadoop:/bin/bash hive:x:991:986::/home/hive:/bin/bash linxuejing:x:3103:3103::/home/linxuejing:/bin/bash
-E:相當(dāng)于“egrep”,表示支持?jǐn)U展的正則表達(dá)式(下面會(huì)說);
-F:支持使用固定字符串,不支持正則表達(dá)式,相當(dāng)于fgrep;
基本正則表達(dá)式元字符:
(1)字符匹配
.:匹配任意單個(gè)字符;
[]:匹配范圍內(nèi)的任意單個(gè)字符;
[^]:匹配范圍外的任意單個(gè)字符;
[a-z]:所有小寫字母;
[A-Z]:所有大寫字母;
[0-9]:所有數(shù)字;
[:digit:]:所有的數(shù)字;
[:lower:]:所有小寫字母;
[:upper:]:所有大寫字母;
[:alpha:]:任意字母(包括大小寫);
[:alnum:]:所有字母和數(shù)字;
[:space:]:空白字符;
[:punct:]:標(biāo)點(diǎn)符號;
[:blank:]:空格和Tab鍵;
[:cntrl:]:所有的控制符(Ctrl+#);
[:print:]:所有可打印字符;
可使用man 7 glob查看;
示例:
.:查找/etc/passwd文件中以“r”開頭“t”結(jié)尾中間跟了兩個(gè)任意單個(gè)字符的行;
[root@localhost ~]# grep "r..t" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[]:查找/tmp/meminfo文件中以S或s開頭的行;
[root@localhost ~]# grep"^[Ss]" /tmp/meminfo SwapCached: 0 kB SwapTotal: 2098172 kB SwapFree: 2098172 kB Shmem: 13128 kB Slab: 234936 kB SReclaimable: 193688 kB SUnreclaim: 41248 kB swap
[a-z]:表示“i”后面根兩個(gè)字符不區(qū)分大小寫的行;
[root@localhost ~]# ifconfig | grep -i"i[a-z][a-z]" eno16777736:flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu1500 inet 192.168.254.130 netmask 255.255.255.0 broadcast 192.168.254.255 inet6 fe80::20c:29ff:fe8e:eb7c prefixlen64 scopeid 0x20<link> TX errors 0 dropped 0 overruns0 carrier0 collisions0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu65536 inet 127.0.0.1 netmask 255.0.0.0 inet6::1 prefixlen128 scopeid 0x10<host> TX errors 0 dropped 0 overruns0 carrier0 collisions0
[[:alpha:]]:查找文件中以任意字母開頭的行;
[root@localhost ~]# grep"^[[:alpha:]]" /tmp/grub2.cfg set pager=1 LH if [ -s $prefix/grubenv ]; then fi if [ "${next_entry}" ] ; then else fi if [ x"${feature_menuentry_id}" =xy ]; then else fi ........
(2)次數(shù)匹配:
*:匹配其前面的字符任意次(包括0次);
[root@localhost ~]# grep "x*y"test2.txt abcy yabcd xxxyabc abgdsfy asdy
\+:匹配其前面的字符至少1次;
[root@localhost ~]# grep "x\+y"test2.txt xxxyabc
.*:任意長度的任意字符;
[root@localhost ~]# grep"x.*y" test2.txt xxxyabc xjgbdfg,n,gnjgy9
\?:匹配前面的字符0次或1次(最多一次),前面的可有可無;
[root@localhost~]# grep "x\?y" test2.txt abcy yabcd xxxyabc abgdsfy asdy xjgbdfg,n,gnjgy
\{m\}:前面的字符精確出現(xiàn)m次,m為非負(fù)數(shù)整數(shù);
root@localhost~]# grep "x\{2\}" test2.txt xxxyabc
\{m,n\}:前面的字符出現(xiàn)至少m次,至多n次;
\{m,\}:至少m次,多了不限;
\{0,n\}:至多n次;
[root@localhost~]# grep "x\{1,3\}y" test2.txt xxxyabc [root@localhost~]# grep "x\{3,\}y" test2.txt xxxyabc
# 顯示“i”后面出現(xiàn)3個(gè)字符; [root@localhost~]# ifconfig | grep"i[[:alpha:]]\{3\}" inet 192.168.254.130 netmask255.255.255.0 broadcast 192.168.254.255 inet6 fe80::20c:29ff:fe8e:eb7c prefixlen 64 scopeid0x20<link> TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
(3)位置錨定
限制使用模式搜索文本,限制模式所匹配到的文本只能出現(xiàn)于目標(biāo)文本的哪個(gè)位置;
^:行首錨定;用于模式的最左側(cè),^PATTERN
[root@localhost~]# grep "^root" /etc/passwd root:x:0:0:root:/root:/bin/bash # 顯示以root字符串開頭的行;
$:行尾錨定;用戶模式的最右側(cè),PATTERN$
^PATTERN$:整行匹配;
^$:空行;也不能有空白字符及Tab鍵;
^[[:space:]]*$:查找只有空白字符的行;并統(tǒng)計(jì)有多少行;
[root@localhost~]# grep "^[[:space:]]*$" /etc/grub2.cfg | wc -l 17
單詞錨定:\<PATTERN\>
單詞:由非特殊字符組成的連續(xù)字符都稱為單詞;
[root@localhost ~]# cat test3.txt root rootls rootnkll openroot [root@localhost ~]# grep "\<root\>" test3.txt root
\<或\b:詞首錨定,用于單詞模式的左側(cè),格式為\<PATTERN, \bPATTERN ;
[root@localhost~]# grep "\<root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
\>或\b:詞尾錨定,用于單詞模式的右側(cè),格式為PATTERN\>, PATTERN\b ;
[root@localhost~]# grep "bash\>" /etc/passwd root:x:0:0:root:/root:/bin/bash mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash gentoo:x:3003:3003::/home/gentoo:/bin/bash ubuntu:x:3004:4004::/home/ubuntu:/bin/bash mint:x:3100:3100::/home/mint:/bin/bash hadoop:x:3102:3102::/home/hadoop:/bin/bash hive:x:991:986::/home/hive:/bin/bash linxuejing:x:3103:3103::/home/linxuejing:/bin/bash
練習(xí):
查找“netstat -tan”命令的結(jié)果中,以“LISTEN”后跟0個(gè)或多個(gè)空白字符結(jié)尾的行;
查找“l(fā)dd /usr/bin/ls”命令的結(jié)果中文件路徑;
查找/etc/grub2.cfg文件中,以至少一個(gè)空白字符開頭,后面又跟了非空白字符的行;
(4)分組與引用
\(PATTERN\):將次PATTERN匹配到的字符當(dāng)做一個(gè)整體進(jìn)行處理;
注意:分組括號中的模式匹配到的字符會(huì)被正則表達(dá)式引擎自動(dòng)記錄于內(nèi)部的變量中,這些變量是\1,\2,\3,....
\n:模式中第n個(gè)左括號以及與之匹配的右括號之間的模式所匹配到的結(jié)果;
示例:
后向引用:引用前面括號中的模式所匹配到的字符串;
\1表示引用前面模式匹配到的結(jié)果后面加一個(gè)“r”的行;
二、擴(kuò)展正則表達(dá)式
egrep:支持使用擴(kuò)展正則表達(dá)式,相當(dāng)于“grep -E”
擴(kuò)展正則表達(dá)式的元字符:多數(shù)和上面一樣,這里知舉例說明不同之處;
字符匹配:
.:任意單個(gè)字符;
[]:范圍內(nèi)的任意單個(gè)字符;
[^]:范圍外的任意單個(gè)字符;
次數(shù)匹配:
*:任意次;
?:0次或一次;
root@localhost~]# egrep "x?y" test2.txt abcy yabcd xxxxxxxxyabc abgdsfy asdy xjgbdfg,n,gnjgy
+:匹配其前面的字符1次或多次;
[root@localhost~]# egrep "x+y" test2.txt xxxxxxxxyabc
{m}:精確匹配m次;
[root@localhost~]# egrep "x{5}y" test2.txt xxxxxxxxyabc # 精確匹配前面的字符5次;
{m,n}:至少m次,至多n次;
[root@localhost~]# egrep "x{3,6}y" test2.txt xxxxxxxxyabc # 匹配前面的字符至少3次,至多6次;
位置錨定:
^:行首
$:行尾
\<,\b:詞首
\>,\b:詞尾
分組及引用
(pattern):分組,括號中的模式匹配到的字符會(huì)被記錄與正則表達(dá)式引擎內(nèi)部的變量中;
或者:表示C或者cat; ls或者LS;
第一次寫博客,寫的不是很好,請多多指教。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。