正则表达式

本文详细介绍了正则表达式的使用,包括grep、cut、sort、uniq和tr等Linux命令行工具的实践应用。通过实例展示了如何进行文本匹配、列截取、排序、去重和字符替换等操作,对于日常文本处理和系统管理具有很高的参考价值。
摘要由CSDN通过智能技术生成

正则表达式

正则表达式通常被用来检索、替换那些符合某个模式的文本。

正则表达式-----通常用于判断语句中,用来检查某一字符串是否满足某一格式

普通字符包括大小写字母、数字、标点符号及一些其他符号

元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于字符前面的字符)在目标对象中的出现模式。

grep “.*”  :元字符是“*”,代表前面字符出现的次数    前导字符“.” 

1、grep [选项] 查找条件 目标文件

-w: 表示精确匹配

-E:开启扩展的正则表达式

-c: 计算找到 ‘搜寻字符串’ 的次数

-i: 忽略大小写

-o: 只显示被模式匹配到的字符串

-v: 反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!(反向查找,输出与查找条件不相符的行)

–color=auto: 可以将找到的关键字词部分加上颜色的显示

-n: 顺便输出行号

grep -v “^$\|^#" ifcfg-ens33  把ifcfg-ens33文件中空行和以#为起始排除掉,把其他内容筛选出来
[root@ky20-zy opt]# ifconfig ens33 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-5]\+"
255.255.255.0
192.168.35.255

基础正则表达式常见字符:特殊字符

image-20220706112123753

[list] :匹配list列表中的一个字符,不能没有,必须要有一个字符

[root@ky20-zy opt]# grep "go[ao]d" zz
good
goad
[root@ky20-zy opt]# cat zz
good
goad
gooald
gooood
gosdfsd

image-20220706114111910

image-20220706114147222

[^list] :匹配任意不在list表中的字符

[root@ky20-zy opt]# grep "go[^b]d" zz
good
goad
gosdfsd

*:和上面搭配使用

[root@ky20-zy opt]# cat zz
good
goad
gold
goald
golad
goaad
gosad
gooald
gooood
gosdfsd
[root@ky20-zy opt]# vim zz
[root@ky20-zy opt]# grep "go[la]*d" zz
goad
gold
goald
golad
goaad
goaald


grep "go[la]\+d" zz
grep "go[la]\?d" zz   只有*号不用加取意符号

查找任意一个字符 “.” 与重复字符 “*”

image-20220707145717447

“[]" 是只能取其中一个值,想要取两个以上为整体的需要用到 ”()“ 要用到 egrep

[root@ky20-zy opt]# egrep -n '^g(oa)' zz
2:goad
4:goald
6:goaad
8:goaald

image-20220707155400073

cut:列截取工具

使用说明:

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一

选项:
-b:按字节截取
-c:按字符截取,常用于中文
-d:指定以什么为分隔符截取,默认为制表符
-f:通常和-d一起

[root@ky20-zy opt]#  cat /etc/passwd | cut -d':' -f 1
root
bin
daemon
adm
lp
sync
打印passwd的第一列    -f后面是几就是打印第几列
[root@ky20-zy opt]# cat /etc/passwd | cut -d':' -f1,3
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
打印passwd的第一和第三列
[root@ky20-zy opt]# cat /etc/passwd | cut -d':' -f1-3
root:x:0
bin:x:1
daemon:x:2
adm:x:3
lp:x:4
打印passwd  1-3列
[root@ky20-zy opt]# who | cut -b 4
t
t
对字节进行截取,第四个字母
[root@ky20-zy ~]# ls | cut -c 2
.
.
.

.

.
n
.

n
z
共
板
频
片
档
载
对字符进行截取,主要针对汉字

sort

是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样
语法:
sort [选项] 参数

常用选项
-t:指定分隔符,默认使用[Tab]吧 键或空格分隔
-k:指定排序区域,哪个区间排序
-n:按照数字进行排序,默认是以文字形式排序
-u:等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
-r:反向排序,默认是升序,-r就是降序
-o:将排序后的结果转存至指定文件

sort sort //不加任何选项默认按第一列升序,字母的话就是从a到z由上

[root@ky20-zy ~]# sort sort
abrt x 173 173
adm x 3 4
apache x 48 48
avahi x 70 70
bin x 1 1
chrony x 993 988
colord x 997 994

sort -n -t: -k3 /etc/passwd //以冒号为分隔符,以数字大小对第三列排序(升序)

[root@ky20-zy ~]# sort -n -t: -k3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

sort -nr -t: -k3 /etc/passwd //以冒号为分隔符,以数字大小对第三列排序(降序)

[root@ky20-zy ~]# sort -nr -t: -k3 /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
zhao:x:1000:1000:zhao:/home/zhao:/bin/bash
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
gluster:x:996:993:GlusterFS daemons:/run/gluster:/sbin/nologin

sort -nr -t: -k3 /etc/passwd -o passwd.bak //将输结果不在屏幕上输出而是输出到passwd.bak文件

sort -u zz.txt //去掉文件中重复的行(重复的行可以是不连续的)

[root@ky20-zy ~]# cat zz.txt
1
1
1

2
2

1

4
4

[root@ky20-zy ~]# sort -u zz.txt

1
2
4

uniq

主要用于去除连续的重复行
注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重

(1)语法
uniq [选项] 参数

(2)常用选项
-c:对重复的行进行计数;
-d:仅显示重复行;
-u:仅显示出现一次的行

image-20220707225211763

tr:

它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符

语法
用法:tr [选项]… SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

常用选项
-d 删除字符
-s 删除所有重复出现的字符,只保留第一个


[root@localhost ~]# cat fruit | tr 'a-z' 'A-Z'
APPLE
APPLE
PEACHE
PEAR
BANANA
CHERRY
CHERRY
BANANA
ORANGE

[root@localhost ~]# cat fruit | tr 'apple' 'APPLE'    //替换是一一对应的字母的替换
APPLE
APPLE
PEAchE
PEAr
bAnAnA
chErry
chErry
bAnAnA
orAngE


[root@localhost ~]# cat fruit | tr 'a' ' '   //把替换的字符用单引号引起来,包括特殊字符
 pple
 pple
pe che
pe r
b n n 
cherry
cherry
b n n 
or nge


[root@localhost ~]# cat fruit | tr 'a' '/'      
/pple
/pple
pe/che
pe/r
b/n/n/
cherry
cherry
b/n/n/
or/nge

[root@localhost ~]# cat fruit | tr 'ap' '/'    //多个字符替换成一个
///le
///le
/e/che
/e/r
b/n/n/
cherry
cherry
b/n/n/
or/nge

[root@localhost ~]# cat fruit | tr 'apple' 'star'    //a替换成s,p替换成a,le替换成r
saarr
saarr
arschr
arsr
bsnsns
chrrry
chrrry
bsnsns
'orsngr'

[root@localhost ~]# cat fruit | tr "'" '/'     //如果想替换单引号则需要用双引号把单引号引起来,反斜杠转义也不行
apple
apple
peache
pear
banana
cherry
cherry
banana
/orange/

[root@localhost ~]# cat fruit | tr -d 'a'    //删除所有a
pple
pple
peche
per
bnn
cherry
cherry
bnn
'ornge'

[root@localhost ~]# cat fruit | tr -d 'apple'    //把所有含有这5个字母的都删除


ch
r
bnn
chrry
chrry
bnn
'orng'


[root@localhost ~]# cat fruit | tr -d '\n'    //删除换行符
appleapplepeachepearbananacherrycherrybanana'orange'[root@localhost ~]#   



[root@localhost ~]# cat fruit | tr -s 'p'    //对p字符去重,只保留第一个
aple
aple
peache
pear
banana
cherry
cherry
banana
'orange'

[root@localhost ~]# cat fruit | tr -s '\n'   //遇到多个回车只保留一个回车,相当于去除空行
apple
apple
peache
pear
banana
cherry
cherry
banana
'orange'

sed [选项] ‘操作’ 参数

sed [选项] -f scriptfile 参数

常见的 sed 命令选项主要包含以下几种。
-e 或–expression=:表示用指定命令或者脚本来处理输入的文本文件。
-f 或–file=:表示用指定的脚本文件来处理输入的文本文件。
-h 或–help:显示帮助。
-n、–quiet 或 silent:表示仅显示处理后的结果。
-i.bak:直接编辑文本文件。
-r, -E 使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流

“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5,20 动作行为”。常见的操作包括以下几种。
a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
s:替换,替换指定字符。
y:字符转换。

2.用法示例
在本小节中依旧以 test.txt 文件为例进行演示。
(1)输出符合条件的文本(p 表示正常输出)

sed -n ‘p’ test.txt

//输出所有内容,等同于 cat test.txt

[root@localhost ~]# sed -n '3p' test.txt	//输出第 3 行
[root@localhost ~]# sed -n '3,5p' test.txt	//输出 3~5 行
[root@localhost ~]# sed -n 'p;n' test.txt	//输出所有奇数行,n 表示读入下一行资料
[root@localhost ~]# sed -n 'n;p' test.txt	//输出所有偶数行,n 表示读入下一行资料
[root@localhost ~]# sed -n '1,5{p;n}' test.txt //输出第 1~5 行之间的奇数行(第 1、3、5 行) he was short and fat.
[root@localhost ~]# sed -n '10,${n;p}' test.txt	//输出第 10 行至文件尾之间的偶数行
[root@ky20-zy opt]# sed -n '1p;3p;5p' lianxi
TYPE="Ethernet"
BROWSER_ONLY="no"
DEFROUTE="yes"
分别输出第1/3/5行的内容
[root@ky20-zy opt]# sed -n '3,$p' lianxi
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
输出第三行到行尾

以上是 sed 命令的基本用法,sed 命令结合正则表达式时,格式略有不同,正则表达式以“/”包围。例如,以下操作是 sed 命令与正则表达式结合使用的示例。

[root@ky20-zy opt]# sed -n '/IP/p' lianxi
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
输出含有IP的行
[root@ky20-zy opt]# sed -n '/^IP/p' lianxi
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
输出以IP为开头的行
[root@localhost ~]# sed -n '/[0-9]$/p' test.txt	//输出以数字结尾的行PI=3.141592653589793238462643383249901429
[root@localhost ~]# sed -n '/\<wood\>/p' test.txt    //输出包含单词wood 的行,\<、\>代表单词边界
[root@ky20-zy opt]# sed -n '4,/no/p' lianxi
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
输出从第 4 行至第一个包含 no 的行
[root@ky20-zy opt]# sed -n '/no/=' lianxi
2
3
6
输出包含no 的行所在的行号,等号(=)用来输出行号
[root@ky20-zy opt]# sed -n '/\<no\>/=' lianxi
3
6
输出包含单词no 的行,\<、\>代表单词边界

删除用法:

[root@ky20-zy opt]# nl lianxi | sed '3d'
     1	TYPE="Ethernet"
     2	PROXY_METHOD="none"
     4	BOOTPROTO="static"
     5	DEFROUTE="yes"
     6	IPV4_FAILURE_FATAL="no"
     7	IPV6INIT="yes"
     8	IPV6_AUTOCONF="yes"
删除第三行
[root@ky20-zy opt]# nl lianxi | sed '3,5d'
     1	TYPE="Ethernet"
     2	PROXY_METHOD="none"
     6	IPV4_FAILURE_FATAL="no"
     7	IPV6INIT="yes"
     8	IPV6_AUTOCONF="yes"
删除3-5行
[root@ky20-zy opt]# nl lianxi | sed '/yes/d'
     1	TYPE="Ethernet"
     2	PROXY_METHOD="none"
     3	BROWSER_ONLY="no"
     4	BOOTPROTO="static"
     6	IPV4_FAILURE_FATAL="no"
删除含有yes的行
[root@ky20-zy opt]# nl lianxi | sed '/yes/!d'
     5	DEFROUTE="yes"
     7	IPV6INIT="yes"
     8	IPV6_AUTOCONF="yes"
     删除不含有yes的行,,  用!取反
[root@ky20-zy opt]# sed '/^[A-Z]/d' lianxi
删除以大写字母为开始的行
[root@ky20-zy opt]# sed '/\"$/d' lianxi
删除以引号为结尾的行
[root@ky20-zy opt]# sed '/^$/d' lianxi
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
删除所有空行

替换符合条件的文本
在使用 sed 命令进行替换操作时需要用到 s(字符串替换)、c(整行/整块替换)、y
(字符转换)命令选项,常见的用法如下所示。

[root@ky20-zy opt]# sed 's/no/yes/' lianxi
TYPE="Ethernet"
PROXY_METHOD="yesne"
BROWSER_ONLY="yes"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
将每行的第一个no换成yes
所有no换成yes的话,应该在末尾加g
sed 's/no/yes/g' lianxi
[root@ky20-zy opt]# sed 's/O/Q/2' lianxi
TYPE="Ethernet"
PROXY_METHQD="none"
BROWSER_QNLY="no"
BOQTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCQNF="yes"
将每行中第二个O换成Q
sed 's/o//g' test.txt	//将文件中的所有o 删除(替换为空串)
sed 's/^/#/' test.txt	//在每行行首插入#号
sed '/the/s/^/#/' test.txt	//在包含the 的每行行首插入#号
sed 's/$/EOF/' test.txt	//在每行行尾插入字符串EOF
sed '3,5s/the/THE/g' test.txt	//将第 3~5 行中的所有 the 替换为 THE
sed '/the/s/o/O/g' test.txt	//将包含the 的所有行中的 o 都替换为 O

迁移符合条件的文本
在使用 sed 命令迁移符合条件的文本时,常用到以下参数.
H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
I,i 忽略大小写

sed '/the/{H;d};$G' test.txt	//将包含the 的行迁移至文件末尾,{;}用于多个操作
sed '1,5{H;d};17G' test.txt	//将第 1~5 行内容转移至第 17 行后
sed '/the/w out.file' test.txt	//将包含the 的行另存为文件 out.file
sed '/the/r /etc/hostname' test.txt	//将文件/etc/hostname 的内容添加到包含 the 的每行以后
sed '3aNew' test.txt	//在第 3 行后插入一个新行,内容为New
sed '/the/aNew' test.txt	//在包含the 的每行后插入一个新行,内容为 New
sed '3aNew1\nNew2' test.txt	//在第 3 行后插入多行内容,中间的\n 表示换行

/在每行行尾插入字符串EOF
sed ‘3,5s/the/THE/g’ test.txt //将第 3~5 行中的所有 the 替换为 THE
sed ‘/the/s/o/O/g’ test.txt //将包含the 的所有行中的 o 都替换为 O






迁移符合条件的文本
在使用 sed 命令迁移符合条件的文本时,常用到以下参数.
H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
  a:追加指定内容。具体操作方法如下所示。
  I,i   忽略大小写

sed ‘/the/{H;d};$G’ test.txt //将包含the 的行迁移至文件末尾,{;}用于多个操作
sed ‘1,5{H;d};17G’ test.txt //将第 1~5 行内容转移至第 17 行后
sed ‘/the/w out.file’ test.txt //将包含the 的行另存为文件 out.file
sed ‘/the/r /etc/hostname’ test.txt //将文件/etc/hostname 的内容添加到包含 the 的每行以后
sed ‘3aNew’ test.txt //在第 3 行后插入一个新行,内容为New
sed ‘/the/aNew’ test.txt //在包含the 的每行后插入一个新行,内容为 New
sed ‘3aNew1\nNew2’ test.txt //在第 3 行后插入多行内容,中间的\n 表示换行


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值