目录
元字符(字符匹配)
元字符:
. 匹配任意单个字符,可以是一个汉字
() 使用转义符,只表示()
[] 匹配指定范围内的任意单个字符,示例:[dn] [0-9] [] [a-zA-Z] [:alpha:]
[^] 匹配指定范围外的任意单个字符,示例:[ ^ z ] a.z
[:alnum:] 字母和数字 [0-9] [a-z] [0-9] [a-z]
[:alpha:] 代表任何英文大小写字符,亦即 [A-Z], [a-z]
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母 [A-Z]
[[:blank:]] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比
[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]] _
\W #匹配非单词构成部分,等价于[^[:alnum:]]
\S #匹配任何非空白字符。等价于 [ ^ \f\n\r\t\v ]。
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
表示次数
#匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符,不包括0次,也就是匹配所有
\? #匹配其前面的字符出现0次或1次,即:可有可无
+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
{n} #匹配前面的字符=n次
{m,n} #匹配前面的字符至少m次,至多n次
{,n} #匹配前面的字符至多n次,<=n
{n,} #匹配前面的字符至少n次
用正则表达式匹配ens33网卡里的ip地址
ifconfig ens33 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
ifconfig
命令用于显示网络接口的配置信息,其中 ens33
是一个网络接口的名称,通过在命令后面添加该选项可以显示该接口的配置信息。grep
命令用于从命令输出中筛选指定的字符串,-o
选项表示只输出匹配的字符串。
正则表达式 "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
表示匹配 IP 地址,其中:
-
[0-9]
表示匹配数字 0-9; -
\+
表示匹配前面的字符 1 次或多次; -
\.
表示匹配小数点字符.
也就是转义符把.标记成就是一个普通的.
因此,该正则表达式表示匹配由四个数字组成的 IP 地址,每个数字之间用小数点分隔开。
整个命令的作用是将 ens33
网络接口的配置信息通过 ifconfig
命令输出到终端,然后使用 grep
命令从输出中筛选出该接口的 IP 地址,并输出到终端。
位置锚定
![](https://img-blog.csdnimg.cn/aa6b69ea89364f9781b2832866b68aff.png)
'^空格$'取空行
查看/etc/fstab目录中没有#号和空行的文本内容
cat /etc/fstab | grep -v "^#" | grep -v "^$"
这个命令用于查看 Linux 系统中当前已经挂载的文件系统列表。
具体来说,cat /etc/fstab
命令用于显示系统中所有已配置的文件系统信息,其中 /etc/fstab
是一个文本文件,存储了文件系统的挂载信息。grep
命令用于在文件中搜索指定的字符串,其中:
-
^#
表示以#
开头的行,表示注释行,使用grep -v "^#"
命令将这些注释行过滤掉; -
^$
表示空行,使用grep -v "^$"
命令将这些空行过滤掉。
因此,整个命令的作用是过滤掉 /etc/fstab
文件中的注释行和空行,只显示已挂载的文件系统信息。
输出的信息包括文件系统名称、文件系统类型、挂载点、挂载选项等信息,可以用来查看当前系统中挂载的所有文件系统。
匹配整个单词(必须把全部单词打完才可以匹配到)
分组
只能匹配到连续的文本内容如果这里输入
则匹配不到ab因为ab不是连续出现的
如果想匹配到
echo abcabcabc | grep "\(ab\)\{1\}"
具体来说,echo abcabcabc
命令将字符串 "abcabcabc" 输出到屏幕上。grep
命令用于在字符串中搜索指定的正则表达式,其中 "\(ab\)\{1\}"
表示一个匹配子串 "ab" 的正则表达式,其中:
-
\(
和\)
表示将其中的表达式作为一个整体,方便后续操作; -
ab
表示匹配子串 "ab"; -
\{1\}
表示匹配前面表达式出现 1 次。
因此,整个命令的作用是在字符串 "abcabcabc" 中匹配子串 "ab",因为该正则表达式中的 \{1\}
表示匹配前面表达式出现 1 次,所以该命令只会匹配一个子串 "ab"。
输出结果为匹配到的子串 "ab"。
注意,该命令只会输出匹配到的内容,而不会输出其他未匹配的内容。
用分组的方式去匹配1和2不要abc
echo 1abc2abc | grep "\(1\|2\)"
扩展正则表达式
在grep后加-E在原本正则中把\去掉就是扩展正则
ifconfig ens33 | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
用扩展正则表达式式查看vim文本中的电话号码
用扩展正则找到邮箱文本的内容
![](https://img-blog.csdnimg.cn/e7b44810621d4c09b0a39c13916dcce5.png)
cat youxiang.txt | grep -E "[0-9a-zA-Z]+@[0-9a-zA-Z]+\.[a-z]{,3}"
该命令用于在文件 youxiang.txt
中查找符合 email 格式的字符串。具体来说,该命令使用了 grep
命令,其中 -E
选项表示使用扩展正则表达式,"[0-9a-zA-Z]+@[0-9a-zA-Z]+\.[a-z]{,3}"
表示匹配符合 email 格式的字符串,其中:
-
[0-9a-zA-Z]+
表示匹配由数字和大小写字母组成的用户名; -
@
表示匹配@
符号; -
[0-9a-zA-Z]+
表示匹配由数字和大小写字母组成的域名; -
\.
表示匹配点号字符.
; -
[a-z]{,3}
表示匹配顶级域名,顶级域名一般由两个及以上的字母组成,但最多只有 3 个字母,例如.com
、.org
、.cn
等。
因此,该命令的作用是从文件 youxiang.txt
中查找符合 email 格式的字符串,并将其输出到终端。与之前的命令相比,该命令匹配顶级域名时将 [a-zA-Z]{2,}
修改为了 [a-z]{,3}
,限制了顶级域名最多只能包含 3 个小写字母,因此该命令只能匹配一些常见的顶级域名,例如 .com
、.org
、.net
、.cn
等,但无法匹配一些特殊的顶级域名,例如 .info
、.museum
等。
用扩展正则查找wenben里的内容
![](https://img-blog.csdnimg.cn/8e5fd55ff7014d7aa26774f0e0263a91.png)
cat wenben.txt | grep -E "^(([0-9]{3})|[0-9]{3})[ -]?[0-9]{3}[ -]?[0-9]{4}"
该命令用于在文件 wenben.txt
中匹配电话号码,具体解释如下:
-
cat wenben.txt
:将wenben.txt
文件中的内容输出到终端; -
|
:将前一个命令的输出作为后一个命令的输入; -
grep -E
:使用grep
命令进行模式匹配,-E
选项表示使用扩展正则表达式; -
"^(\([0-9]{3}\)|[0-9]{3})[ -]?[0-9]{3}[ -]?[0-9]{4}"
:匹配符合电话号码格式的字符串。
该正则表达式的具体含义如下:
-
^
:表示匹配行首,即从行首开始匹配电话号码; -
(\([0-9]{3}\)|[0-9]{3})
:匹配 3 个数字,可以用小括号和不带括号两种方式表示; -
[ -]?
:匹配可选的空格或短横线字符; -
[0-9]{3}
:匹配 3 个数字; -
[ -]?
:匹配可选的空格或短横线字符; -
[0-9]{4}
:匹配 4 个数字。
因此,该正则表达式可以匹配符合电话号码格式的字符串,并从行首开始匹配。如果电话号码出现在一行的中间或末尾,则不会被匹配到。如果需要匹配行中的电话号码,可以将正则表达式中的 ^
去掉即可。
sed编辑器
sed对文本内容进行增删改查
sed的两种模式
一种sed -i永久生成在文本文件当中
一种sed临时模式,文本的内容是不会发生变化的模式空间执行:用户选择永久生效,那就写在硬盘上,临时生效,就在模式空间,用户读取之后结束之所以有临时模式就是为了让你可以返回修改先用临时模式看一下是否正确,确认无误后再永久修改
sed的工作流程读取,执行,显示
-
读取
sed
命令会从输入流中读取数据,并将其存储在一个叫做“模式空间”(pattern space)的缓冲区中。模式空间可以理解为一个临时存储数据的区域,sed
命令每次从输入流中读取一行数据,并将其存储在模式空间中。当模式空间中的数据被处理完毕后,sed
命令会自动将其删除,并从输入流中读取下一行数据。
-
执行
sed
命令会在模式空间中对数据进行操作,并将结果输出到标准输出或文件中。执行的操作通常包括查找、替换、删除、添加等。sed
命令使用的操作命令可以从命令行参数中指定,也可以从脚本文件中读取。
sed执行的操作命令通常有以下几种形式:
-
s/regexp/replacement/flags
:查找模式空间中的文本,并用 replacement 替换之。可以使用 flags 来控制替换方式,例如g
表示全局替换,i
表示大小写不敏感等; -
/regexp/command
:如果模式空间中的文本匹配 regexp,则执行指定的 command; -
d
:删除模式空间中的文本; -
p
:打印模式空间中的文本。
执行命令完成后,sed
命令会输出处理后的结果,通常是打印到标准输出或写入文件中。
-
显示
sed
命令会在执行过程中将处理的结果输出到标准输出或文件中。输出的内容可以通过重定向和管道操作进行进一步的处理。
以上就是 sed
命令的工作流程,读取、执行、显示这三个步骤的协同作用,使得 sed
命令可以快速高效地处理文本数据。
sed
其常用的选项
有 -e
、-f
、-h
、-i
、-n
等。这些选项的含义和作用如下:
以上就是 sed
命令的常见操作符及其作用。可以根据不同的需求选择不同的操作符进行文本处理。
该命令的作用是在指定文件中查找符合电话号码格式的行并输出。电话号码格式可以是带区号和横杆或空格的格式,例如 123-456-7890
或 (123) 456-7890
,也可以是不带区号但带横杆或空格的格式,例如 456-7890
或 456 7890
。不符合上述格式的行不会被输出。
-
-e
:用于指定一个或多个编辑命令,多个命令之间使用分号;
分隔。可以使用多个-e
选项来指定多个编辑命令,例如sed -e 's/old/new/g' -e '/pattern/d' file
; -
-f
:用于指定一个包含编辑命令的脚本文件。在脚本文件中可以包含多个编辑命令,每个命令一行,例如sed -f script.sed file
; -
-h
:默认情况下,sed
命令会将每行文本输出到标准输出中,同时会输出文件名和行号。使用-h
选项可以禁止输出文件名和行号,只输出编辑后的文本; -
-i
:用于直接修改文件,而不是将修改后的文本输出到标准输出中。执行该命令后,原文件会被直接修改,因此要谨慎使用。还可以在-i
后面添加备份文件的后缀,例如sed -i.bak 's/old/new/g' file
; -
-n
:默认情况下,sed
命令会将每行文本输出到标准输出中,使用-n
选项可以禁止输出任何文本。该选项通常和编辑命令中的p
命令一起使用,例如sed -n '/pattern/p' file
,表示仅输出匹配pattern
的行。这里就是过滤掉了sed的默认输出只显示了打印的结果 -
使用这些选项可以使得
sed
命令更加灵活和高效,可以用于各种文本处理场景。sed命令的操作符
sed
是一个流编辑器,它可以对输入流中的文本进行增、删、改等操作。sed
命令的常见操作符如下: -
s
:替换命令,用于将文本中的某些内容替换为新的内容。命令格式为s/old/new/g
,其中old
表示需要被替换的文本,new
表示新文本,g
表示全局替换。例如,命令sed 's/apple/orange/g'
可以将文本中所有的apple
替换为orange
; -
d
:删除命令,用于删除指定的行。命令格式为d
,例如,命令sed '2d'
表示删除文本中的第二行; -
a
:添加命令,用于在指定行后添加文本。命令格式为a\
,例如,命令sed '2a\This is a new line.'
表示在文本的第二行后添加一行新文本; -
i
:插入命令,用于在指定行前插入文本。命令格式为i\
,例如,命令sed '2i\This is a new line.'
表示在文本的第二行前插入一行新文本; -
c
:替换命令,用于替换指定行的文本。命令格式为c\
,例如,命令sed '2c\This is a new line.'
表示将文本的第二行替换为新文本; -
y
:转换命令,用于将指定字符转换为其他字符。命令格式为y/chars1/chars2/
,其中chars1
表示需要被转换的字符集,chars2
表示转换后的字符集。例如,命令sed 'y/abc/def/'
将文本中所有的a
转换为d
,b
转换为e
,c
转换为f
; -
p
:打印命令,用于输出指定行的文本。命令格式为p
,例如,命令sed -n '2p'
表示输出文本中的第二行; -
=
:输出行号命令,用于在指定行打印行号。命令格式为=
,例如,命令sed '='
会输出文本中每一行的行号; -
l
:显示命令,用于将文本中的非打印字符转换为可打印字符进行显示。命令格式为l
,例如,命令sed -n '2l'
表示以可打印字符形式显示文本中的第二行; -
r
:读取命令,用于从文件中读取文本并将其插入到指定行后。命令格式为r file
,其中file
表示需要读取的文件名。例如,命令sed '2r file.txt'
表示将文件file.txt
中的内容插入到文本的第二行后。 -
以上就是
sed
命令的常见操作符及其作用。可以根据不同的需求选择不同的操作符进行文本处理。 -
sed后面打印内容一定要加""也可以用''但是主推用''因为有些模式只支持单引号
-
同样也支持管道符
sed指定行号打印
-
sed只显示行号用于确认有多少行
-
sed既显示行号又显示所有内容
-
sed 显示最后一行
-
sed行号的范围区间打印1-3行
-
sed打印第五行到最后一行
-
sed打印第一行和最后一行
,表示从哪到哪;表示什么和什么
-
sed 打印第二行向下两行包括第二行
-
奇数行和偶数行打印
n在前就是偶数p在前就是奇数
打印偶数行
sed -n 'n;p' test.txt
打印奇数行
sed -n 'p;n' test.txt
如果想要显示行号可以加上=;
sed -n '=;p;n' test.txt
对包含的字符串进行打印
打印所有包含t的行
-
既可以打印包含单个字符的行也可以打印包含整个单词的行
-
sed使用正则表达式
打印所有以root开头的行
-
打印以bash为结尾的行
-
从第四行开始打印到第一个bash为结尾的行结束
sed -m '/bash$/p' /etc/passwd
sed -r {n} {n,} {n,m} { ,m}不需要加 \ 逻辑或 \ | |
用sed来打印出text.txt的内容
sed -n -E '/^([0-9]{3}[- ]|[(][0-9]{3}[)] ?)[0-9]{3}[- ][0-9]{4}$/p' text.txt
以下是命令的详细解释:
sed -n -E '/^([0-9]{3}[- ]|[(][0-9]{3}[)] ?)[0-9]{3}[- ][0-9]{4}$/p' text.txt
其中:
-
sed
是使用 sed 命令进行文本处理。 -
-n
表示只输出匹配到的行。 -
-E
表示使用扩展正则表达式。 -
/.../p
表示匹配行并输出。 -
^
表示匹配行开头。 -
(...)
表示一个组,内部表示一个区号,可能带括号,后面跟着空格或横杆。 -
|
表示或,用于区别带横杆或空格的电话号码。 -
[0-9]
表示数字。 -
{3}
表示前面的表达式匹配 3 次。 -
[- ]
表示匹配横杆或空格,注意-
在字符集中需要放在第一个字符位置,否则会被解释为范围符号。 -
[(]
和[)]
表示匹配左右括号,括号需要用反斜杠转义。 -
?
表示前面的表达式匹配 0 或 1 次。 -
$
表示匹配行结尾。 -
text.txt
是要处理的文本文件名。