正则表达式
- 1.通配符和正则表达式的区别
- 2.基本正则表达式
-
- [2.1 元字符 (字符匹配)](#2.1 元字符 (字符匹配))
- [2.2 表示匹配次数](#2.2 表示匹配次数)
- [2.4 位置锚定](#2.4 位置锚定)
- [2.5 分组 和 或者](#2.5 分组 和 或者)
- 3.扩展正则表达式
- 4.部分文本处理工具
-
- [4.1 tr 命令](#4.1 tr 命令)
- [4.2 cut命令](#4.2 cut命令)
- [4.3 sort命令](#4.3 sort命令)
- [4.4 uniq命令](#4.4 uniq命令)
1.通配符和正则表达式的区别
通配符一般用于文件名匹配。
正则表达式一般用于匹配文件内容。
2.基本正则表达式
2.1 元字符 (字符匹配)
匹配符1 | 功能 |
---|---|
. | 匹配任意单个字符,可以是一个汉字 |
[ ... ] | 匹配指定范围内的任意单个字符 |
[ ^... ] | 匹配指定范围外的任意单个字符 |
^ [ ... ] | 匹配以...开头的 |
bash
#补充说明#
. #表示匹配任意字符
[. ] #方括号中的. 就是本身的含义
/. #和[. ]相同
匹配符2 | 功能 |
---|---|
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字符,亦即 A-Z, a-z |
[:upper:] | 大写字母,相当于[A-Z] |
[:lower:] | 小写字母,相当于[a-z] |
[:blank:] | 空白字符(空格和制表符) |
[:space:] | 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白 |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃...) |
[:digit:] | 十进制数字 |
[:xdigit:] | 十六进制数字 |
[:print:] | 可打印字符 |
[:graph:] | 可打印的非空白字符 |
[:punct:] | 标点符号 |
bash
#补充说明#
[:space:] 比[:blank:]包含的范围广
匹配符3 | 功能 |
---|---|
\w | 匹配单词构成部分 |
\W | 匹配非单词构成部分 |
\s | 匹配任何非空白字符 |
\S | 匹配任何空白字符,包括空格、制表符、换页符等等 |
bash
#补充说明#
\w 等价于[_[:alnum:]]
\W 等价于[^_[:alnum:]]
\S 等价于 [^ \f\n\r\t\v]
\s 等价于 [ \f\n\r\t\v]
2.2 表示匹配次数
匹配符 | 功能 |
---|---|
* | 匹配前面的字符任意次,包括0次 |
.* | 任意长度的任意字符,不包括0次 |
? | 匹配其前面的字符出现0次或1次 |
+ | 匹配其前面的字符出现最少1次 |
{n} | 匹配前面的字符n次 |
{m,n} | 匹配前面的字符至少m次,至多n次 |
{,n} | 匹配前面的字符至多n次,<=n |
{n,} | 匹配前面的字符至少n次 |
示例:怎么提取IP地址?
bash
ifconfig ens33|grep netmask \
|grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+'|head -n1
# \+ 表示匹配前面的字符最少一次
# \. 表示转译 因为.表示匹配任意字符
2.4 位置锚定
匹配符 | 功能 |
---|---|
^ | 行首锚定 |
$ | 行尾锚定 |
^$ | 空行 |
^ [[:space:]]*$ | 空白行 |
\ < 或 \b | 词首锚定 |
\ > 或 \b | 词尾锚定 |
\bPATTERN\b | 匹配整个单词 |
示例1:统计/etc/fstab 文件中有多少真实单词?
bash
cat /etc/fstab | grep -o '\b[a-zA-Z]\+\b'|wc -l
#不要有空格
示例2: 统计/etc/fstab文件中不是已#号开头的非空行的行数
bash
cat /etc/fstab | grep "^[^#[:space:]]" | wc -l
# ^ 以...开头
#[非# 和 非空行]
#或者
grep -vE "^\s*#|^$"
2.5 分组 和 或者
bash
#分组#
( x y)
将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
bash
#或者#
x \| y
x或者y
示例:组合运用
bash
echo 1abc 2abc 3abc |grep -o "1\|2abc"
#只匹配了1或者2abc
1
2abc
echo 1abc 2abc 3abc |grep -o "\(1\|2\)abc"
#1abc或者2abc
1abc
2abc
3.扩展正则表达式
bash
#基本格式#
grep -E
-E表示使用扩展正则表达式
匹配符 | 功能 |
---|---|
* | 匹配前面子表达式0次或者多次 |
.* | 任意长度的任意字符 |
? | 匹配前面子表达式0次或者1次,即:可有可无 |
+ | 与星号相似,表示其前面字符出现一次或多次,但必须出现一次,>=1 |
{n,m} | 匹配前面的子表达式n到m次 |
{m} | 匹配前面的子表达式m次 |
{n,} | 匹配前面的子表达式不少于n次, >=n |
{,n} | 匹配前面的子表达式最多n次,<=n |
I | 用逻辑或方式指定正则表达式要是用的模式 |
() | 字符串分组,将括号中的字符串作为一个整体 |
示例1:提取当前主机的IP地址
bash
ifconfig ens33 | grep netmask| grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -n 1
#-E表示使用扩展正则表达式
192.168.2.100 #执行结果
4.部分文本处理工具
4.1 tr 命令
tr
命令用于字符转换或字符删除。
bash
#基本格式#
tr [选项] 字符集1 字符集2
#字符集1 是要被替换或删除的字符集
#字符集2 是要替换为的字符集
bash
#常用选项#
-c 除了指定的字符之外的所有字符都会被替换
-d 表示删除指定的字符
-s 表示压缩重复的字符为单个字符
示例1: 将文本中的大写字母转换为小写字母
bash
echo "Hello World" | tr '[:upper:]' '[:lower:]'
hello world
示例2:删除文本中的数字
bash
echo "123abc456" | tr -d '[:digit:]'
abc
示例3:将文本中的空格合并为单个空格
bash
echo "Hello World" | tr -s ' '
Hello World
示例4: 删除文本中的特殊字符
bash
echo "Hello @#World" | tr -d '@#'
Hello World
4.2 cut命令
cut
命令可以提取文本数据中指定的列。
cut
命令可以根据指定的字符位置或指定的字段分隔符来截取文本,并将结果输出到标准输出或指定的文件。
bash
#基本格式#
cut [选项] 文件
bash
-d 指定字段的分隔符,默认为制表符。
-f 指定要提取的字段列表,字段列表之间使用逗号分隔,例如`-f 1,3,5`
-c 指定要提取的字符位置列表,字符位置列表之间使用逗号分隔,例如`-c 1-5,10-15`
--complement 提取指定字段或字符位置之外的内容
bash
#提取文件的第一列
cut -f1 file.txt
#提取文件的第二、四、五列,并使用逗号作为分隔符
cut -f2,4,5 -d',' file.txt
#提取文件的前五个字符:
cut -c1-5 file.txt
# 提取文件的第一列以外的所有列:
cut -f 2 --complement file.txt
4.3 sort命令
sort
命令用于对文本文件进行排序,默认以字母排序。
bash
#基本格式#
sort [选项] file
bash
#常用选项#
-b 忽略行首空白字符
-r 以倒序方式进行排序
-f 忽略大小写进行排序
-n 按照数值大小进行排序
-u 去除重复行
-t 指定字段分隔符
-k 指定按照字段排序
4.4 uniq命令
uniq
命令用于找出或删除文本文件中连续出现的重复行。
bash
#基本格式#
uniq [选项] [输入文件 [输出文件]]
#如果不指定输入文件,则会从标准输入获取数据
#如果不指定输出文件,则结果会打印到标准输出
bash
#常用选项#
-c 在输出结果中显示每行重复出现的次数。
-d 只显示重复行。
-u 只显示不重复的行。