35、正则表达式

一、正则表达式命令

正则表达式:匹配的是文本内容,linux的文本三剑客都是针对文本内容。

grep 过滤文本内容

sed 针对文本内容进行增删改查

awk 按行取列

文本三剑客----都是按照行进行匹配。

1.1、grep筛选:

grep的作用就是使用正则表达式来匹配文本内容。

选项:

-m 数字 匹配几次之后停止

复制代码
[root@test1 opt]# grep -m 1 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@test1 opt]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

-v 取反

复制代码
grep -v root /etc/passwd   ##除了root,筛选所有

-n 显示匹配的内容及行号

复制代码
[root@test1 opt]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

-c 只统计匹配的行数

复制代码
[root@test1 opt]# grep -c root /etc/passwd 
2

-o 仅显示匹配的结果

复制代码
[root@test1 opt]# grep -o root /etc/passwd 
root
root
root
root

-q 静默模式。不输出任何信息。

复制代码
[root@test1 opt]# grep -q root /etc/passwd > /opt/123.txt
[root@test1 opt]# cat /opt/123.txt
[root@test1 opt]# grep -m 1 root /etc/passwd > /opt/123.txt
[root@test1 opt]# cat /opt/123.txt
root:x:0:0:root:/root:/bin/bash

-A after 数字,后几行

复制代码
grep -A 3 root /etc/passwd

-B before 数字 ,前几行

复制代码
grep -B 3 root /etc/passwd

-C 数字,前后各几行

复制代码
grep -C 3 root /etc/passwd

-e 或者

复制代码
 grep -e root -e xy102 /etc/passwd

-E 匹配扩展正则表达式

-f 匹配两个文件相同的内容,以第一个文件为准

复制代码
[root@test1 opt]# vim kl1.txt
abc
acv
abf123
234
456
aaa
bbb
ccc
abc
acv
abf123
234
456
aaa
bbb
ccc
abc
acv
abf


[root@test1 opt]# vim kl1.txt

123
345
qqq
aaa
abf
avg
afh


[root@test1 opt]# grep -f kl.txt kl1.txt
123
aaa
abf

-r 递归目录 目录下的文件内容,软连接不包含在内。

复制代码
[root@test1 opt]# grep -r 123 /opt/
/opt/test41.sh:  echo 123 | passwd --stdin $user
/opt/test41.sh:  echo 123 | passwd --stdin $user
匹配到二进制文件 /opt/.123.swp

-R 递归目录 目录下的文件内容,软连接包含在内。

复制代码
[root@test1 opt]# grep -R abf /opt/
/opt/nginx-1.22.0/src/core/ngx_crc32.c:    0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
/opt/999.txt:abf123

1.2、sort排序:

sort

以行为单位,对文件的内容进行排序

sort 选项 参数

-f:忽略大小写,相同字母默认大写排在前面

-b:忽略每行之前的空格

-n:按照数字大小进行排序,此时不是按照单个字符进行比较,而是行首所有连续的数字都能被识别,按照识别到的数字的大小进行排序。且此时字母排序优先级高于数字

-r:反向排序

-u:去重,相同内容仅显示一次

-o:把排序后的结果转存到指定文件

-k:指定字段(字符)进行排序

-t:指定字段的分隔符

复制代码
[root@test1 opt]# sort 123.txt





111
112
123
222
333
555
aaa
aaa
aaa
bbb
bbb
cc
ddd
DDD
EEE
nnn

cat file | sort 选项

-f 忽略大小写,默认会把大写字母排在前面

复制代码
[root@test1 opt]# sort -f 123.txt





111
112
123
222
333
555
aaa
aaa
aaa
bbb
bbb
cc
DDD
ddd
EEE
nnn

-b 忽略每行之前的空格,空格也显示(不是把空格删除,只是按照数字和字母的顺序排列)

复制代码
[root@test1 opt]# sort -b 123.txt




​	
 123
345
345
 345
567
987
aaa
bbb
bbb
BD
bfvf
SD
sdfd
sds

-n 按照数字进行排序

复制代码
[root@test1 opt]# sort -n 123.txt




​	
aaa
bbb
bbb
BD
bfvf
SD
sdfd
sds
 123
345
345
 345
567
987

-r 反向排序

复制代码
[root@test1 opt]# sort -r 123.txt
sds
sdfd
SD
bfvf
BD
bbb
bbb
aaa
987
567
 345
345
345
 123

-u 相同的数据只显示一行

复制代码
[root@test1 opt]# sort -u 123.txt

	
 123
345
 345
567
987
aaa
bbb
BD
bfvf
SD
sdfd
sds

-o 把排序后结果转存到指定的文件

复制代码
[root@test1 opt]# sort -u 123.txt


 123
345
 345
567
987
aaa
bbb
BD
bfvf
SD
sdfd
sds
[root@test1 opt]# cat 123.txt | sort -rno 234.txt
[root@test1 opt]# cat 234.txt
987
567
 345
345
345
 123
sds
sdfd
SD
bfvf
BD
bbb
bbb
aaa

1.3、uniq 去重

uniq 去除连续重复的行,只显示一行

-c 统计连续行的次数,合并连续重复的行

复制代码
[root@test1 opt]# uniq -c 123.txt
      1  345
      1 567
      1 987
      1  123
      2 345
      1 bbb
      1 bfvf
      2 
      1 sdfd
      1 SD
      1 BD
      2 
      1 	
      1 sds
      2 aaa
      1 bbb

-u 显示仅出现一次的行(包括不适合连续出现的重复行)

复制代码
[root@test1 opt]# uniq -u 123.txt
 345
567
987
 123
bbb
bfvf
sdfd
SD
BD
	
sds
bbb

-d 仅显示连续重复的行(不包括非连续出现的内容)

复制代码
[root@test1 opt]# uniq -d 123.txt   ##显示重复的行
345                          


aaa

1.4、tr压缩替换

tr:用来对标准输出的字符进行替换,压缩和删除。

-c 保留字符集1的字符,其他的字符用字符集2替换

echo 字符集 |tr -c "字符集1" "字符集2"

复制代码
[root@test1 ~]# echo abc
abc
[root@test1 ~]# echo abc | tr -c "ab" "d"
abdd

-d 删除字符集中的一部分

echo abc |tr -d "a"

复制代码
[root@test1 ~]# echo abc | tr -d "a"
bc

-s 把字符集1的部分替换成字符集2的部分,连续重复出现的字符压缩成一个字符

压缩:

复制代码
[root@test1 ~]# echo aaabaaca | tr -s "a"
abaca

替换压缩:

复制代码
[root@test1 ~]# echo aaabaaca | tr -s 'a' 'w'
wbwcw

1.5、cut

cut快速裁剪 awk都可以按行取列

对字段进行截取和裁剪。

-d 指定分隔符(默认的分隔符是tab键)

复制代码
[root@test1 opt]# cut -d ':' -f 1-3 /etc/passwd
root:x:0
bin:x:1
daemon:x:2

-f 对字段进行截取,指定输出段的内容

复制代码
[root@test1 opt]# cut -d ':' -f 1-3 /etc/passwd
root:0
bin:1
daemon:2

-b 以字节为单位进行截取

-c 以字符为单位进行截取

--complement 输出的时候排除指定的字段

复制代码
[root@test1 opt]# head -n 1 /etc/passwd | cut -d ':' --complement -f 1-3 
0:root:/root:/bin/bash
[root@test1 opt]# head -n 1 /etc/passwd | cut -d ':' --complement -f 1 
x:0:0:root:/root:/bin/bash

--output-delimiter 更改输出内容的分隔符

复制代码
[root@test1 opt]# head -n 1 /etc/passwd | cut -d ':' -f 1-3 --output-delimiter='@' 
root@x@0

1.6、split文件的拆分:

split大文件拆分若干个小文件。

-l 按行来进行分割

复制代码
[root@test1 opt]# split -l 30 test1.txt xy102

-b按照大小来分割

复制代码
[root@test1 opt]# split -b 30m test1.txt xy102

面试题:

现在有一个日志文件,很大5g。第一个能不能快速打开?

拆分:-l 按行 -b 大小

这种大文件推荐使用按大小。

这种小文件推荐使用按行。

1.7、文件合并:

cat

paste

面试题:

cat合并和paste合并之间的区别:

cat是上下合并。

paste是左右合并。

cat 文本1 文本2 展示不改变

cat 文本1 文本2 > 文本3 合并以后传入文本3中

paste 文本1 文本2 展示不改变

paste 文本1 文本2 > 文本3 合并以后传入文本3中

面试题:主机连接状态有几种

复制代码
[root@test1 opt]# ss -antp | grep -v 'State' | cut -d " " -f 1 | sort | uniq -c
      2 ESTAB
     15 LISTEN

三、正则表达式:

正则表达式:由一类特殊字符以及文本字符所编写的一个模式,模式又来匹配文件当中内容(字符)。

校验我们输入的内容是否满足。格式,长度等等要求。

主要用来匹配文本内容,命令的结果。

通配符:只能用于匹配文件名和目录名。不能匹配文件二点内容和命令结果。

正则表达式:

3.1、基本正则表达式:

元字符(字符匹配)

bash 复制代码
. :匹配任意单个字符

\ :转义符:恢复字符的本意

[] :匹配指定的范围内的任意单个字符或者数字,区分大小写,也可以用1-5,a-t这样的方式范围匹配

[^] :取反,表示匹配除了^之后的内容

^ :匹配以^之后内容开头的字符

^# :匹配以#开头的行

^$ :匹配空行

[ ]:中括号里输入空格,就可以匹配空格

注:匹配内容两边需要加引号,单引号双引号都可以

. 任意单个字符,也可以是一个汉字。

\ 转义符 ,恢复其本意。

复制代码
ls | grep "\."

\] 匹配指定范围内的任意单个字符或者数字 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fb65e022241a4531af92a0be60aaa0e0.png) \[\^\]为取反 "\^"为 以什么开头的行 \^#:以#开头 \^$:表示空行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9a6698f615024cb19e2c9024ffb8bc50.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/faf0bed3d5b84d7fa1936e327a784bbc.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2737dec38ba647c5842ba2e9913e359a.png) 表示次数,匹配字符出现的字数: \*匹配**前面的字符**任意次,0次也可以。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0e9f16aaccf244bdad1215f912fe2668.png) .\*匹配前面的字符,至少有1次。匹配所有。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0fdad604b4ce4a3eb52cb632f8a60737.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3cae2cb63ba14b478bae3b73b91a6c32.png) \\?匹配前面的字符,没匹配到就是0次或者1次,可有可无。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e6245148229443a2b6c3a0fc4872b375.png) \\ + 匹配的前面字符,至少出现一次\>=1。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4db6bcfc3f6a46a6a4b6a9d367736e9d.png) \\ {n \\ }匹配前面的字符=n次,可以小于n,但是不能大于n,而且前面的字符必须是连续出现 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2f1532b7949f4c54b5b9135ae3f1009a.png) \\ {m,n \\ }匹配前面的字符,最少m次,最多n次,必须是连续出现,超出的不在匹配范围。 \\ {,n \\ }匹配前面的字符,最多n次,必须是连续出现,超出的不在匹配范围。不能少n次, ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8e5e208532334784921e140f8fbf6899.png) \\ {n, \\ }匹配前面的字符,最少n次 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2f4969993ecc432584a64cd384f92776.png) 位置锚定: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2cf3758ce5954aa0a7de83dccb184617.png) \^:以什么为开头,行首锚定 $:以什么为结尾,行尾锚定 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c5841002092d417799720afe30639e4c.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f35c0d0a045748c995c619d45969c8b2.png) "\^root$":只包含root。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/53fa7edbe68746038b6e65918a2ce998.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/53dd39d0064c46b2b2341bf713cff16e.png) \\ \< 或者\\ b 词首锚定,匹配单词的左侧(连续的数字,字母,下划线都算单词内部) \\ \> 或者 \\ b 词尾锚定,匹配单词的右侧 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0d10570c321944589272ae9d5aa72eb3.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/89eef03baea54b489a063669dcb2a0e3.png) \\b单词\\b:匹配整个单词。空格隔开的也算整个单词。 \^单词$:整行只有这一个单词。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/323397385e5c48af88348b9c831a500a.png) 区别: 分组和逻辑关系 分组() 或者 \| ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b5055b30ae2b4d9895740a0db0c69ba5.png) ### 3.2、扩展正则表达式: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3713b479c24e4ec6b3c78bb219b327d7.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f017c4c416194d90817f6476e760722d.png) #### grep -E "" =egrep "" ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8bec833ed86044bb9b6900d7c89b7087.png) 987-123-4567 987 456-1230 (123) 456-7890 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5ab7f621c74d491282cee72b274bfaa6.png) ## 作业: 1、显示/etc/passwd中以sh结尾的行; [root@localhost opt]# cat /etc/passwd | egrep "sh\b" 2、查找/etc/inittab中含有"以s开头,并以d结尾的单词"模式的行; [root@localhost opt]# cat /etc/inittab | egrep "\bs[a-z]+d\b" 3、查找ifconfig命令结果中的1-255之间的整数; [root@localhost opt]# ifconfig | egrep -o "\b[1-9]\b|\b[1][0-9][0-9]\b|\b[2][0-5][0-5]\b" 4、在/etc/passwd中取出默认shell为bash的行; [root@localhost opt]# cat /etc/passwd | egrep "\bbash\b" 5、高亮显示passwd文件中冒号,及其两侧的字符 [root@localhost opt]# cat /etc/passwd | egrep ".?[:]+.?"

相关推荐
Jwoka2 小时前
正则表达式学习笔记
笔记·python·正则表达式·re
晨曦5432103 小时前
python——正则表达式
开发语言·正则表达式
学c真好玩2 天前
4.7正则表达式
正则表达式
专注VB编程开发20年2 天前
C#,VB.NET正则表达式法替换代码
正则表达式·c#·.net·vb.net
辛-夷3 天前
正则表达式(一)
前端·javascript·正则表达式
刘大猫.3 天前
前端使用正则表达式提取经纬度 度分秒值
正则表达式·经纬度·前端使用正则·提取经纬度·提取度分秒·度分秒·vue使用正则
天狼12225 天前
java 正则表达式优化
java·mysql·正则表达式
阿达C5 天前
深入解析 Python 正则表达式:全面指南与实战示例
python·mysql·正则表达式
技术小结-李爽6 天前
正则表达式(Regular Expression,简称 Regex)
正则表达式
G皮T7 天前
【Python Cookbook】字符串和文本(五):递归下降分析器
数据结构·python·正则表达式·字符串·编译原理·词法分析·语法解析