首页 > 代码库 > 【Linux相识相知】文本处理工具之grep\egrep\fgrep及正则表达式

【Linux相识相知】文本处理工具之grep\egrep\fgrep及正则表达式

常说Linux上有文本处理的三剑客,grep、sed和awk,本文就grep做出详细的描述,并引出正则表达式。

 

grep

NAME:打印模式匹配的行SYNOPISIS:       grep [OPTIONS] PATTERN [FILE...]       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]常用选项:--color=auto:对匹配到的文本着色后进行高亮显示,默认已被别名alias grep=grep --color=auto-i:忽略字符的大小写-o:仅显示匹配到的字符串本身-v:显示不能被模式匹配到的行-E:支持使用扩展的正则表达式-q:静默模式,即不输出任何信息-A #:显示被模式匹配的行及其后#行-B #:显示被模式匹配的行及其前#行-C #:显示被模式匹配的行及其前后各#行

 

举例1:匹配/etc/passwd下有frank的行

[root@localhost tmp]# grep "frank" /etc/passwdfrank:x:1000:1000:frank:/home/frank:/bin/bash

 

举例2:匹配/etc/passwd下有frank的行,忽略大小写

[root@localhost tmp]# grep -i "frank" /etc/passwdfrank:x:1000:1000:frank:/home/frank:/bin/bashFrank:x:1001:1001::/home/Frank:/bin/bash

 

举例3:匹配/etc/passwd下不能被bash匹配的行

[root@localhost tmp]# grep -v "bash" /etc/passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown......pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologingdm:x:42:42::/var/lib/gdm:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologintcpdump:x:72:72::/:/sbin/nologin

 

举例4:仅仅匹配/etc/passwd下的frank,忽略大小写

[root@localhost tmp]# grep -oi "frank" /etc/passwdfrankfrankfrankFrankFrank

 

举例5:静默模式匹配含有frank的行

[root@localhost tmp]# grep -q "frank" /etc/passwd[root@localhost tmp]# 

 

举例6:匹配/etc/passwd下含有ftp的行及其后3行

[root@localhost tmp]# grep -A 3 "ftp" /etc/passwdftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

 

举例7:匹配/etc/passwd下含有ftp的行及其前3行

[root@localhost tmp]# grep -B 3 "ftp" /etc/passwdmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

 

举例8:匹配/etc/passwd下含有ftp的行及其前后各2行

[root@localhost tmp]# grep -C 2 "ftp" /etc/passwdoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin

 

egrep

支持扩展正则表达式实现类似于grep的文本过滤功能,相当于grep -E

NAME:打印模式匹配的行SYNOPISIS:        egrep [OPTIONS] PATTERN [FILE...]   -i:忽略字符的大小写-o:仅显示匹配到的字符串本身-v:显示不能被模式匹配到的行-q:静默模式,即不输出任何信息-A #:显示被模式匹配的行及其后#行-B #:显示被模式匹配的行及其前#行-C #:显示被模式匹配的行及其前后各#行-G:支持基本正则表达式

 

fgrep

fgrep搜索字符串而不是搜索匹配的表达式的模式,所以支持正则表达式,当无需要用到元字符去编写模式的时候,使用fgrep必能更好更快。

支持-i,-v,-o,-A,-B,-C,-p等选项

 

正则表达式

Regular Expression,正则表达式,由一类特殊字符及文本字符编写的模式,其中有些不表示其字面的意义,而是用户控制或通配功能,分为基本正则表达式和扩展正则表达式。

基本正则表达式元字符:

字符匹配

. :匹配任意单个字符;[]:匹配指定范围内的任意单个字符;      特殊匹配:[:digit:] 匹配任意单个数字                        [:lower:] 匹配任意单个小写字母                        [:upper:] 匹配任意单个大写字母                        [:alpha:] 匹配任意单个字母                        [:alnum:] 匹配任意单个字母或数字                        [:punct:] 匹配任意单个符号                        [:space:] 匹配单个空格[^]:匹配指定范围外的任意单个字符;

 

匹配次数

用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数,默认工作于贪婪模式

*:匹配其前面的字符任意次数:0,1,多次      .*:匹配任意长度的任意字符\?:匹配其前面的字符0次或者1次;\+:匹配其前面的字符1次或者多次;\{m\}:匹配其前面的字符m次\{m,n\}:匹配其前面的字符至少m次,至多n次        \{m,\}:至少m次

 

位置锚定

^:托字符,行首锚定,用于模式的最左侧$:行尾锚定,用于模式的最右侧

单词:非特殊字符组成的连续字符(字符串)都称为单词

\<或\b:词首锚定,用于单词模式的左侧\>或\b:词尾锚定,用户单词模式的右侧\<PATTERN\>:匹配完整单词

 

分组及引用

分组:\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理后向引用:引用前面的分组括号中的模式所匹配到的字符分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中:\1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容\2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容以此类推

 

举例:

1.显示/etc/passwd文件中不以/bin/bash结尾的行

[root@localhost tmp]# grep -v "/bin/bash$" /etc/passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin......gdm:x:42:42::/var/lib/gdm:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologintcpdump:x:72:72::/:/sbin/nologin

2.找出/etc/passwd文件中的两位或三位数字

[root@localhost tmp]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwdmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologin......sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologintcpdump:x:72:72::/:/sbin/nologin

3.找出etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;

[root@localhost tmp]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg   load_env   set default="${next_entry}"   set next_entry=   save_env next_entry   set boot_once=true   set default="${saved_entry}"  menuentry_id_option="--id"  menuentry_id_option=""  set saved_entry="${prev_saved_entry}"  save_env saved_entry  set prev_saved_entry=  save_env prev_saved_entry  set boot_once=true

4.找出"netstat -tan"命令的结果中以LISTEN后跟0,1或多个空白结尾的行

[root@localhost tmp]# netstat -tan | grep  "LISTEN[[:space:]]*$"tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     tcp6       0      0 :::111                  :::*                    LISTEN     tcp6       0      0 :::22                   :::*                    LISTEN     tcp6       0      0 ::1:631                 :::*                    LISTEN     tcp6       0      0 ::1:25                  :::*                    LISTEN 

 

扩展正则表达式元字符:

字符匹配

. :匹配任意单个字符;[]:匹配指定范围内的任意单个字符;      特殊匹配:[:digit:] 匹配任意单个数字               [:lower:] 匹配任意单个小写字母               [:upper:] 匹配任意单个大写字母               [:alpha:] 匹配任意单个字母               [:alnum:] 匹配任意单个字母或数字               [:punct:] 匹配任意单个符号               [:space:] 匹配单个空格[^]:匹配指定范围外的任意单个字符;

 

匹配次数

用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数,默认工作于贪婪模式。

*:匹配其前面的字符任意次数:0,1,多次   .*:匹配任意长度的任意字符?:匹配其前面的字符0次或者1次;+:匹配其前面的字符1次或者多次;{m}:匹配其前面的字符m次{m,n}:匹配其前面的字符至少m次,至多n次   {m,}:至少m次

 

位置锚定

^:托字符,行首锚定,用于模式的最左侧$:行尾锚定,用于模式的最右侧

单词:非特殊字符组成的连续字符(字符串)都称为单词

\<或\b:词首锚定,用于单词模式的左侧\>或\b:词尾锚定,用户单词模式的右侧\<PATTERN\>:匹配完整单词

 

分组及引用

分组:():将一个或多个字符捆绑在一起,当做一个整体进行处理后向引用:引用前面的分组括号中的模式所匹配到的字符分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中:\1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容\2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容以此类推

 

a|b:a或bC|cat:C或cat
(C
|c)at:cat或Cat

 

【Linux相识相知】文本处理工具之grep\egrep\fgrep及正则表达式