欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

正则表达式

程序员文章站 2022-07-08 10:46:26
正则表达式 定义:使用单个字符串来描述或匹配一系列符合某个句法规则的字符串 在很多文本编辑器或其他工具里,正则表达式通常用来检索和替换那些符合某个模式的文本内容 grep工具的使用 # grep [-cinvABC] 'word' filename -c 表示打印符合要求的行数 -i 表示忽略大小写 ......

正则表达式

定义:使用单个字符串来描述或匹配一系列符合某个句法规则的字符串

在很多文本编辑器或其他工具里,正则表达式通常用来检索和替换那些符合某个模式的文本内容

grep工具的使用

# grep [-cinvabc]  'word'  filename

  -c   表示打印符合要求的行数

  -i   表示忽略大小写

  -n   表示输出符合要求的行及其行号

  -v   表示打印不符合要求的行

  -a   后面跟一个数字(有无空格都可以),表示打印符合要求的行以及下面n行

正则表达式

  -b   后面跟一个数字,表示打印符合要求的行以及上面n行

正则表达式

  -c   后面跟一个数字,表示打印符合要求的行以及上下各n行

正则表达式

过滤出带有某个关键词的行,并输出行号

# grep -n 'root' /etc/passwd

正则表达式

过滤出不带有某个关键词的行,并输出行号

# grep -nv 'nologin' /etc/passwd

正则表达式

过滤出所有包含数字的行

# grep '[0-9]' /etc/inittab

(只要有一个数字就算匹配到了)

正则表达式

过滤出所有不包含数字的行

# grep -v '[0-9]' /etc/inittab

(和上一例的结果正好相反,只要是包含一个数字,就不显示)

正则表达式

过滤掉所有空行和以#开头的行

编辑一个文件

# vi /etc/sos.conf

正则表达式

# grep -v '^#' /etc/sos.conf |grep -v '^$'

^表示行的开始,$表示行的结尾,^$表示空行

正则表达式

过滤出不以英文字母开头的行

编辑一个文件

# mkdir /tmp/1/

# vi /tmp/1/test.txt

正则表达式

#  grep '^[^a-za-z]' /tmp/1/test.txt

^表示除[ ]内字符之外的字符

正则表达式

# grep '[^a-za-z]' /tmp/1/test.txt

正则表达式

过滤出任意一个字符和重复字符 

# grep 'r.o' /etc/passwd

.表示任意一个字符,r.o表示把r和o之间有一个任意字符的行过滤出来

正则表达式

#  grep 'ooo*' /etc/passwd

*表示零个或多个*前面的字符

正则表达式

#  grep '.*' /etc/passwd |wc -l

.*表示零个或多个任意字符,空行也包含在内

不加 |wc -l 表示把符合要求的行都列出来

正则表达式

指定要过滤出的字符出现次数 

# grep 'o\{2\}' /etc/passwd

符号{ }内部为数字,表示前面的字符要重复的次数,{ }左右都需要加上转义字符\

正则表达式

egrep工具的使用 

egrep是grep的扩展,可以完成grep不能完成的工作

编辑一个文件

# vi /tmp/1/test.txt

正则表达式

过滤出一个或多个指定的字符 

# egrep 'o+' /tmp/1/test.txt

# egrep 'oo+' /tmp/1/test.txt

# egrep 'ooo+' /tmp/1/test.txt

+符号表示匹配1个或多个+前面的字符

正则表达式

#  egrep 'o{2}' /etc/passwd

可以直接使用{ },不用加转义符号

正则表达式

过滤出零个或一个指定的字符 

# egrep 'o?' /tmp/1/test.txt

# egrep 'ooo?' /tmp/1/test.txt   

# egrep 'oooo?' /tmp/1/test.txt

正则表达式

过滤出字符串1或者字符串2 

# egrep 'aaa|111|ooo' /tmp/1/test.txt

正则表达式

()的应用 

# egrep 'r(oo|at)o' /tmp/1/test.txt

()表示一个整体,会把包含rooo或者rato的行过滤出来

正则表达式

#  egrep '(oo)+' /tmp/1/test.txt

把()和其他符号组合在一起,表示一个或多个

正则表达式

sed工具的使用 

sed工具是流式编辑器,是针对文档的行来操作的

打印某行

-n 表示只显示我们要打印的行,无关紧要的内容不显示

# sed -n '2'p /etc/passwd

单引号内数字表示第几行

正则表达式

# sed -n '1,$'p /tmp/1/test.txt

把所有行都打印出来

正则表达式

# sed -n '1,3'p /tmp/1/test.txt

指定区间打印

 正则表达式

打印包含某个字符串的行 

# sed -n '/root/'p /tmp/1/test.txt

# sed -n '/^1/'p /tmp/1/test.txt

# sed -n '/in$/'p /tmp/1/test.txt

# sed -n '/r..o/'p /tmp/1/test.txt

# sed -n '/ooo*/'p /tmp/1/test.txt

正则表达式

# sed -e '1'p -e '/111/'p -n /tmp/1/test.txt

-e    实现多个行为

正则表达式

删除某些行 

只是删除显示内容,文档内容不会改变

# sed '1'd /tmp/1/test.txt

# sed '1,3'd /tmp/1/test.txt

# sed '/oot/'d /tmp/1/test.txt

d   表示删除,不仅可以删除指定的单行以及多行,而且可以删除匹配某个字符的行

正则表达式

替换字符或者字符串 

# sed '1,2s/ot/to/g' /tmp/1/test.txt

s  表示替换

g  表示本行全局替换 

正则表达式

除了可以使用 / 作为分隔符外,还可以使用其他特殊字符

# sed 's#ot#to#g' /tmp/1/test.txt

# sed 's@ot@to@g' /tmp/1/test.txt

正则表达式

删除文档中的内容 

# sed '/[0-9]//g' /tmp/1/test.txt

删除文档中的所有数字

正则表达式

# sed 's/[a-za-z]//g' /tmp/1/test.txt

删除文档中的所有字母

正则表达式

调换两个字符串的位置 

# sed 's/\(rot\)\(.*\)\(bash\)/\3\2\1/' /tmp/1/test.txt

() 属于特殊符号,必须在前面加转义字符\

正则表达式

#  sed -r 's/(rot)(.*)(bash)/\3\2\1/' /tmp/1/test.txt

-r 省略转义字符

正则表达式

# sed 's/^.*$/123&/' /tmp/1/test.txt 

在某一行前后增加指定内容

正则表达式

直接修改文件内容 

# sed -i 's/ot/to/g' /tmp/1/test.txt

-i   直接修改文件中内容

正则表达式

awk工具的使用 

awk也是流式编辑器,针对文档中的行来操作。awk兼具sed的所有功能,而且更加强大

截取文档中的某个段

# head -n2 /tmp/1/test.txt |awk -f':' '{print $1}'

-f  指定分隔符,后面紧跟单引号

print 表示打印,用来打印某个字段,要用{}括起来

$1 表示第一个字段

正则表达式

# head -n2 /tmp/1/test.txt |awk -f':' '{print $0}'

$0 表示整行

正则表达式

# head -n2 /tmp/1/test.txt |awk -f ':' '{print $1"#"$2"#"$3"#"$4}'

打印自定义内容

正则表达式

匹配字符或者字符串 

# awk '/oo/' /tmp/1/test.txt

正则表达式

# awk -f ':' '$1~/oo/' /tmp/1/test.txt

~表示匹配,可以让某个段匹配

正则表达式

#  awk -f ':' '/root/ {print $1,$3} /test/ {print $1.$3}' /tmp/1/test.txt

可以多次匹配

正则表达式

条件操作符 

# awk -f ':' '$3=="0"' /etc/passwd

== 表示等于,精准匹配

正则表达式# awk -f ':' '$3>=500' /etc/passwd

打印uid大于500的行

正则表达式

# awk -f ':' '$7!="/sbin/nologin"' /etc/passwd

!=表示不匹配

正则表达式

# awk -f ':' '$3<$4' /etc/passwd

在两个段之间进行逻辑比较

正则表达式

# awk -f ':' '$3>"5" && $3<"7"' /etc/passwd

&&表示“并且”

正则表达式

# awk -f ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd

||表示“或者”

正则表达式

awk的内置变量

# head -5 /etc/passwd |awk -f ':' '{ofs="#"} {print $1,$3,$4}'

ofs用来定义分隔符,在输出的时候定义

正则表达式

# head -n3 /etc/passwd |awk -f ':' '{print nf}'

nf表示用分隔符分隔后一共有多少段

# head -n3 /etc/passwd |awk -f ':' '{print $nf}'

$nf是最后一段的值

正则表达式

# head -n3 /etc/passwd |awk -f ':' '{print nr}'

nr表示行号

# awk 'nr>10' /etc/passwd

nr可以作为判断条件

正则表达式

# awk -f ':' 'nr<20 && $1 ~ /roo/' /etc/passwd

nr也可以配合段匹配一起使用

正则表达式

awk中的数学运算

# head -n 3 /etc/passwd |awk -f ':' '$1="root"'

更改段值

正则表达式

# head -n2 /etc/passwd |awk -f ':' '{$7=$3+$4; print $0}'

对各个段的值进行数学运算

正则表达式

# awk -f ':' '{(tot=tot+$3)}; end {print tot}' /etc/passwd

计算某个段的总和

end是awk特有的语法,表示所有的行都已经执行

正则表达式

# awk -f ':' '{if ($1=="root") {print $0}}' /etc/passwd

if表示判断

正则表达式