转至:https://www.cnblogs.com/tui463/archive/2004/01/13/12199909.html
正则表达式
定义:使用单个字符串来描述或匹配一系列符合某个句法规则的字符串
在很多文本编辑器或其他工具里,正则表达式通常用来检索和替换那些符合某个模式的文本内容
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)/321/' /tmp/1/test.txt
() 属于特殊符号,必须在前面加转义字符
# sed -r 's/(rot)(.*)(bash)/321/' /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表示判断