文章目录
- 七、正则表达式
- 7.1、通配符 * { } [ ] [^] ?
- 7.2、单引号、双引号、不加引号、反引号
- 7.3、正则表达式概述
- 7.4、 转义符号(空白符) \n \t \r \v \0 \b
- 7.5、BRE- ^ $ 以...开头/结尾的行
- 7.6、BRE- . 匹配除换行符之外的任意单个字符
- 7.7、BRE- * 匹配重复0次及以上次数的字符
- 7.8、BRE- .* 所有
- 7.9、BRE- \[ ] 括号中的任意一个字符 ; [^] 不是括号中的字符
- 7.10、ERE- + 匹配前面字符连续出现1次或多次
- 7.11、ERE- ?匹配前面字符 0 次或 1 次
- 7.12、ERE- | 或 匹配竖杠两边的任意一个
- 7.13、ERE- a{n,m} 匹配前面字符a至少出现n次,最多m次
- 7.14、ERE- () 括号里的相当于一个整体;
- 7.15、字母符号 \w \W \b \S \s
- 7.16、Posix字符
- 八、文本处理之grep
七、正则表达式
7.1、通配符 * { } [ ] [^] ?
通配符 | 解释 |
---|---|
* | 匹配所有字符,可以输出一个或多个字符 |
{ } | 生成序列 |
[ ] | [a-z]匹配小写字母任何一个 |
[^] | 取反排除 |
? | 匹配任何一个字符,只匹配一个字符 |
- * 与 ?区别展示 :查找当前目录下的txt文件
[hadoop1@hadoop1 test]$ ls *.txt
aaa.txt a.txt b.txt
[hadoop1@hadoop1 test]$ ls ?.txt
a.txt b.txt
[hadoop1@hadoop1 test]$ ls ???.txt
aaa.txt
- { } 生成序列 :创建test1…test10命名的文本文件
[hadoop1@hadoop1 test]$ touch test{1..10}.txt
[hadoop1@hadoop1 test]$ ll
总用量 16
-rw-rw-r-- 1 hadoop1 hadoop1 80 5月 25 13:01 aaa.txt
-rwxrwxr-x 1 hadoop1 hadoop1 373 5月 21 19:36 a.sh
-rw-rw-r-- 1 hadoop1 hadoop1 80 5月 25 13:01 a.txt
-rw-rw-r-- 1 hadoop1 hadoop1 50 5月 25 13:01 b.txt
drwxr-xr-x 2 hadoop1 hadoop1 23 5月 22 11:59 test1
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test10.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test1.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test2.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test3.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test4.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test5.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test6.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test7.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test8.txt
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 25 13:24 test9.txt
- [ ] 与 [^] 分别查找字符串“123asDe6ht893”中的字母与非字母
7.2、单引号、双引号、不加引号、反引号
引号类型 | 解释 |
---|---|
单引号 ’ ’ | 所见即所得,单引号里面是什么就输出什么 |
双引号 " " | 双引号里面的特殊符号与变量会被解析 |
不加引号 | 支持通配符 |
反引号 ` ` | 优先执行反引号里面的命令 (位于键盘的ESC下面) |
- 分别利用不同引号打印这句话my name is `hostname` {1…4}
# 单引号 :所见即所得 尽管hostname在反引号里,但整体在单引号里面 不解析原有含义
[hadoop1@hadoop1 test]$ echo 'my name is `hostname` {1..4}'
my name is `hostname` {1..4}
# 双引号 :解析原含义 反引号优先解析hostname主机名;双引号不支持通配符
[hadoop1@hadoop1 test]$ echo "my name is `hostname` {1..4}"
my name is hadoop1 {1..4}
# 不加引号:优先解析反引号;支持通配符
[hadoop1@hadoop1 test]$ echo my name is `hostname` {1..4}
my name is hadoop1 1 2 3 4
7.3、正则表达式概述
- 功能:匹配字符(主要工具grep、sed、awk)
- 注意:
- 1️⃣所有符号均为英文状态下的符号
- 2️⃣推荐使用grep工具(过滤命令,先了解,后面深入介绍)或网站正则解析,看看正则执行过程或匹配了什么内容;必须要亲手操作,才有印象
- 分类:
- 1️⃣基础正则BRE(basic regular express):^ $ ^$ . * [] [^]
- 2️⃣扩展正则ERE(extend regular express):| + {} () ? 使用grep时需-E才可以;或者利用egrep命令
- 通配符和正则区别:
- 通配符:文件/目录 文件名 处理的是参数;Linux大部分命令可以使用
- 正则: 进行过滤 在一个文件中查找内容;Linux中的grep\sed\awk支持
# a.txt文件内容
1This a Linux testfile!
2This is a linux testfile!
1java tes
3python test
1lalala
# b.txt 文件
aabbbc
defrrg
klvvvvvvf
ffffghlllll
hhhhhhhhhhggf
eeeeeeeeeeeeeegrtrhk
23456defrh44444
7.4、 转义符号(空白符) \n \t \r \v \0 \b
空白符 | 描述 |
---|---|
\n | 换行符,重要 |
\r | 回车符 |
\t | 水平制表符,重要 |
\v | 垂直制表符 |
\0 | 空值符 |
\b | 退后一格 |
- 执行前必须加 “-e” 支持转义字符,否则结果如下:
[hadoop1@hadoop1 test]$ echo "123\n456"
123\n456
[hadoop1@hadoop1 test]$ echo "123\t456"
123\t456
- 加上-e后的打印输出
[hadoop1@hadoop1 test]$ echo -e "123\n456"
123
456
[hadoop1@hadoop1 test]$ echo -e "123\t456"
123 456
[hadoop1@hadoop1 test]$ echo -e "123\b456"
12456
[hadoop1@hadoop1 test]$ echo -e "123\r456"
456
[hadoop1@hadoop1 test]$ echo -e "123\v456"
123
456
7.5、BRE- ^ $ 以…开头/结尾的行
- 查找以 “1” 开头的行
- 查找以 “t” 结尾的行
- 匹配空行 (-n显示行号)
- 匹配非空行(-v显示与正则不匹配的行)
- 查找以 “1” 开头以 “s” 结尾的行见7.8 .*
7.6、BRE- . 匹配除换行符之外的任意单个字符
-
匹配任意单字符 ( -o显示查找过程,过程:从第一行的第一个字符开始查找,因此一个字符一行内容)
-
匹配以 . 结尾的行 (.在正则中为任意字符的意思,所以.$会匹配任意字符(初换行符)结尾的行;要想.为原本含义,需加反斜杠进行转义)
7.7、BRE- * 匹配重复0次及以上次数的字符
贪婪性:连续出现时,尽可能多的匹配
- 字符串中连续出现的2(一次及以上)
7.8、BRE- .* 所有
- 查找 以任意内容开头到a的行
- 查找以 “1” 开头以 “s” 结尾的行
[hadoop1@hadoop1 test]$ grep "^1.*s$" a.txt 1java tes
可以看一下不加.*和加.\*的区别:不加.*就是指改行内容只有1s;.加了\*才是指1开头s结尾的正则
7.9、BRE- [ ] 括号中的任意一个字符 ; [^] 不是括号中的字符
- 匹配数字
- 匹配字母(忽略大小写 可以用-i忽略大小写)
- 以大写字母开头,小写字母或空格结尾的行
- 不是以大写字母开头的行 [^] (
^在括号内就是非的意思;在括号外就是以括号里字符开头的意思
)
7.10、ERE- + 匹配前面字符连续出现1次或多次
- 查找字母h出现次数达到1次及以上 (-o只显示匹配到的内容)
7.11、ERE- ?匹配前面字符 0 次或 1 次
- 查找def的前面字符为任意字符的 (.?代表一个字符或者没有字符;…?第一个.表示一个任意字符,第二个.?表示一个或没有字符;所以意思就是def前至少含有一个字符)
7.12、ERE- | 或 匹配竖杠两边的任意一个
|和[]区别
:
符号 | 共同点 | 区别 | 示例 |
---|---|---|---|
| | 或者 | 可以是一串字符,可以匹配单词等 | cat|dog 匹配cat 或dog |
[ ] | 或者 | 只能匹配其中的单个字符 | [dog cat] 匹配的是d o g c a t 字母之一 |
7.13、ERE- a{n,m} 匹配前面字符a至少出现n次,最多m次
- f连续出现次数的范围在2—5之间
7.14、ERE- () 括号里的相当于一个整体;
# 数据准备
echo -e "ccat\npcut\nctg\nabcg"
ccat
pcut
ctg
abcg
- 寻找单词cat和cut
- cat和cut只有中间字母不一样,就能想到用ca|ut ,但是很明显 这是获取ca或者ut,而a和u位于同一个位置,因此可以利用()括起来代表二取其一。
- cat和cut只有中间字母不一样,就能想到用ca|ut ,但是很明显 这是获取ca或者ut,而a和u位于同一个位置,因此可以利用()括起来代表二取其一。
7.15、字母符号 \w \W \b \S \s
特殊字符 | 描述 |
---|---|
\w | 匹配任意数字和字母,等效[a-zA-Z0-9] |
\W | 与\w 相反,等效[^a-zA-Z0-9] |
\b | 匹配字符串开始或结束,等效^和$ |
\s | 匹配任意的空白字符,如\n\t等 |
\S | 匹配非空白字符 |
7.16、Posix字符
Posix字符 | 描述 |
---|---|
[:alnum:] | 等效[a-zA-Z0-9] |
[:alpha:] | 等效[a-zA-Z] |
[:lower:] | 等效[a-z] |
[:upper:] | 等效[A-Z] |
[:digit:] | 等效[0-9] |
[:space:] | 匹配任意空白字符,等效[\t\n\r\f\v] |
[:graph:] | 非空白字符 |
[:blank:] | 空格与定位字符 |
[:cntrl:] | 控制字符 |
[:print:] | 可显示的字符 |
[:punct:] | 标点符号字符,等 价 于[-!”#$%&’()*+,./:;<=>?@[]_‘ |
[:xdigit:] | 十六进制 |
正则表达式总结
基础正则 | 解释 |
---|---|
^ | 匹配前面字符串开头; ^a |
$ | 匹配前面字符串结尾; a$ |
^$ | 空行 |
. | 匹配除换行符(\n)之外的任意单个字符 |
* | 匹配前一个字符零次或多次 |
.* | 所有,贪婪性 |
[ ] | 匹配中括号之中的任意一个字符; [a-z] [A-Z] [0-9] [abc] |
[^] | 匹配[^字符]之外的任意一个字符; [^abc] abc之外的字符 |
\t | 制表符 tab键 |
\n | 换行符 |
扩展正则 | 解释 |
---|---|
+ | 匹配前面字符 1 次或多次 |
? | 匹配前面字符 0 次或 1 次 |
{n}或{n,} | 匹配花括号前面字符至少 n个字符 |
{,m} | 匹配花括号前面字符至多m个字符 |
{n,m} | 匹配花括号前面字符至少 n个字符,最多 m 个字符 |
( ) | 1、表示整体 2、向后引用(反向引用) \n 反向引用,n 是数字,从 1 开始编号,表示引用第 n 个分组匹配的内容 |
| | 匹配竖杠两边的任意一个 |
八、文本处理之grep
- Linux grep 命令用于查找文件里符合条件的字符串。
- grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一行显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
- 只输出含有查找内容的那一行
- 用法:grep [选项] 正则表达式 [文件或目录…]
选项 | 描述 |
---|---|
grep -E ==egrep | 模式是扩展正则表达式(ERE),不需要加反斜杠的 |
-e | 使用模式匹配,可指定多个模式匹配 |
-i | 忽略大小写 |
-w | 模式匹配整个单词 |
-x | 模式匹配整行 |
-v | 打印不匹配的行 |
-r | 递归目录查找 |
-n | 打印行号 |
-m 数字 | 输出前m个匹配 |
-c | 输出匹配的行数 |
- 太多了,不一一展示了,更多的参数选择参考菜鸟教程:Linux grep 命令
# 数据准备 a.txt
This a linuxtestfile!
This is a linux testfile!
java test
python test
mysql
hadoop hive
linux
8.1、-w 精确匹配单词
8.2、-c 匹配的总行数 -x 匹配整行 -v 显示非匹配的 -n 显示行号
8.3、-e 多模式匹配 ;-m n 显示前n个匹配内容
- -e用法:grep -e “正则” -e “正则” 文件