shell

shell.1.7 正则表达式与grep

 

一、linux的文本处理工具
grep : 文本过滤工具(模式:pattern);
sed : stream   editor , 流编辑器;文本编辑工具;
awk : Linux上的实现为 gawk , 文本报告生成器(格式化文本);

二、正则表达式:Regual   Expression , REGEXP ;
由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;

正则表达式分类:
基本正则表达式:BRE
扩展正则表达式:ERE

基本正则表达式的元字符 与 扩展正则表达式的元字符是有区别的;

三、grep : Global  search  REgular  EXpression  and  Print  out  the  line .
grep 作用:
文本搜索工具,根据用户指定的 “模式(过滤条件)”对目标文件逐行进行匹配检查;打印匹配的行;

grep 模式:
由正则表达式的元字符及文本字符所编写的过滤条件;

grep 命令:
grep   [OPTIONS]   PATTERN   [FILE…]
grep   [OPTIONS]   [-e PATTERN  |  -f   FILE]   [FILE…]

OPTIONS:
–color=auto : 对匹配到的文本着色后高亮显示;
-i, –ignore-case : 忽略字符大小写;
-o : 仅显示匹配到的字符串本身;
-v, –invert-match : 显示不能被模式匹配到的行;
-E : 支持使用扩展的正则表达式元字符;
-q, –quiet, –silent : 静默模式,即不输出任何信息;

-A NUM, –after-context=NUM : 显示匹配到的行,以及后 NUM 行;
-B NUM, –before-context=NUM : 显示匹配到的行,以及前 NUM 行;
-C NUM, -NUM, –context=NUM : 显示匹配到的行,以及前后 NUM 行;

四、基本正则表达式元字符
字符匹配;
匹配次数;
位置锚定;
分组及引用;

4.1 字符匹配
. : 匹配任意单个字符;
[] : 匹配指定范围内的任意单个字符;
[^]: 匹配指定范围外的任意单个字符;

[[:upper:]] : 表示任意一个大写字母;
[[:lower:]] : 表示任意一个小写字母;
[[:alpha:]] : 表示任意一个字母—任意一个大写字母或者小写字母;
[[:digit:]] : 表示任意一个数字;
[[:alnum:]] : 表示任意一个字母(大写或者小写)或者数字;
[[:space:]] : 表示一个空白符号;
[[:punct:]] : 表示任意一个标点符号;

4.2 匹配次数
用在要指定其出现的次数的字符后面,用于限制其前面的字符出现的次数;

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

\{0,n\} : 至多 n 次;
\{m,\} : 至少 m 次;

4.3 位置锚定

^ : 行首锚定;用于模式的最左侧;
$ : 行尾锚定;用于模式的最右侧;
^PATTERN$ : 用 PATTERN 来匹配整行;
^$ : 空白行;
^[[:space:]]*$ : 空白行或包含空白字符的行;

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

理解如下:
1. 显示/etc/passwd文件中不以/bin/bash结尾的行;
grep    -v    “/bin/bash$”    /etc/passwd

2. 找出/etc/passwd文件中的两位数或三位数(数字);
grep    “\<[0-9]\{2,3\}\>”    /etc/passwd

[root@localhost tmp]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
epmd:x:998:996:Erlang Port Mapper Daemon:/tmp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mariadb:x:997:995::/home/mariadb:/sbin/nologin
[root@localhost tmp]#

3. 找出/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面跟非空白字符的行;
grep    “[^[:space:]]\+[^[:space:]]”    /etc/grub2.cfg

4. 找出 “netstat -tan” 命令的结果中以 ‘LISTEN’ ,后跟0、1或多个空白字符结尾的行;
netstat    -tan  |  grep    “LISTEN[[:space:]]*$”

[root@localhost tmp]# netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0     52 192.168.206.129:22      192.168.206.1:62257     ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
[root@localhost tmp]# 
[root@localhost tmp]# netstat -tan | grep "LISTEN[[:space:]]*$"
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
[root@localhost tmp]#

4.4 分组及引用
\(\) : 将一个或多个字符捆绑在一起,当作一个整体进行处理;

分组括号中模式匹配到的内容,会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1 : 模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2 : 模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

后向引用:引用前面的分组括号中的模式所匹配到的字符;

[root@localhost tmp]# more aa
he loves his lover.
he likes his lover.
she lovers her liker.
she likes her liker.
[root@localhost tmp]# 
[root@localhost tmp]# grep "\(l..e\).*\1" aa
he loves his lover.
she likes her liker.
[root@localhost tmp]#

 

Leave a Reply

Your email address will not be published. Required fields are marked *