正则表达式

正则表达式

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

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

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表示判断

 

posted @ 2020-03-30 18:45  腿腿腿长一米八  阅读(290)  评论(0编辑  收藏  举报