一、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]#