正则三侠grep/egrep,sed,awk

一、正则表达式

什么是正则?正则就是一串由规律的字符串,在shell中用处很大,常用的指令有grep/egrep,sed,awk。

grep更适合单纯的查找或者匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行复杂格式处理。

1

grep通常配合管道符一起使用:grep -参数 ‘word’ filename

-c

统计行数

-i

不区分大小写

-n

显示行号

-v

取反

-r

遍历所有子目录

-A

加数字过滤出符合要求的行以及下面n行

-B

同上,过滤出符合条件的行以及上面n行

-C

同上,过滤出符合条件的行以及上下n行

-E

显示符合多个条件的记录

2、

engrep进阶版

grep ‘[0-9]’ passwd

显示包含数字的行

grep -v ‘[0-9]’ passwd

显示不包含数字的行

grep -v ‘^#’ passwd

显示不以#开头的行

grep -v ‘^#’ passwd|grep -v ‘^@’

显示既不以#也不以@开头的行

grep ‘^[^a-zA-Z]’ passwd

显示不包含字母并且不是以字母开头的行,第一个^表示以什么开头,第二个^表示取反

grep ‘r.o’ passwd

查询r o中间包含一个字符的行

grep ‘o*’ passwd

查询含有任意个o的行

grep ‘o\{2\}’ passwd/grep -E ‘o{2}

查询含有两个连续o的行

egrep ‘o{2}’ passwd

查询含有两个连续o的行

egrep ‘o+’ passwd

查询含有o的行

egrep ‘oo?’ passwd

查询含有o的行

egrep ‘root|nologin’ passwd

查询含有root或者nologin的行

egrep ‘(oo){2}’ passwd

重复出现两次oo组合的字符串

grep ‘o\{2\}’ passwd 中\为转义符,因为{}是特殊字符所以要转义

 

 

也可以使用grep -E ‘o{2}’ passwd来显示

如果不加转义符,结果显示为

 

 

3、

sed是一种流编辑器,可以实现行的输出替换删除等操作

n

只打印模式匹配的行

e

可以同时打印多行,为默认选项

f

将sed操作写在另一个文件内

i

直接修改文件内容

n\?

匹配n零或一次

\{m,n\}

匹配前面字符至少m此至多n次

\{m\}

精确匹配前面字符m次

[ ]

匹配[ ]内任意单个字符

[^]

匹配除[ ]内任意单个字符

r

可以省去很多转义操作

sed -n ‘5’p passwd

打印出第五行

sed -n ‘1,5’ passwd

打印1-5行

sed -n ‘1,$’p passwd

打印所有

sed -n ‘/root/’p passwd

打印包含root的行

sed -n ‘/^1/’p passwd

打印以1开头的行

sed -n ‘/r..o/’p passwd

打印r和o中间有两个字符的行

sed -n ‘/oo*/’p passwd

打印含有o的行

sed -e ‘1’p -e ‘/111/’p -n passwd

打印第一行和包含111的行

sed ‘1’d passwd

打印不显示第一行

sed ‘/oot/’d passwd

打印不包含oot的行

sed ‘1,2s/ot/to/g’ passwd

将1-2行所有ot替换为to

sed ‘s#ot#to#g’ passwd

将所有的ot替换为to

sed ‘s/[0-9]/%/g’ passwd

将所有数字替换成%

sed ‘s/[a-zA-Z]/%/g’ passwd

将所有字母替换成%

sed -r ‘s/(root)(.*)(nologin)/\3\2\1/’

见下图*1

sed ‘s/^.*$/123&/’ passwd

将123添加到每行行首

sed -i ‘s/ot/to/g’ passwd

将所有ot替换为to

*1

 

4、

awk是一种文本处理语言

-F

指定输入文件分隔符

-v

赋予一个用户定义的变量

~

匹配,与==相比不是精确比较

ARGC

命令行变元个数

ARGV

命令行变元数组

FILENAME

当前输入文件名

FNR

与NR类似,每个文件从1开始

FS

输入域分隔符,默认为一个空格

RS

输入记录分隔符

NF

有几个域即分隔符分开几个字段

$NF

最后一个列

OFS

输出分割符

ORS

输出记录分隔符

head -n2 passwd|awk -F ‘:’ {print $1}’

显示文本前两行的第一列

head -n2 passwd|awk -F ‘:’ {print $0}’

显示前两行

awk -F ‘:’ ‘{print $1”#”$2”#”$3”

#”$4}’

显示前四列并以#分隔开

awk ‘/oo/’ passwd

显示带有oo的行

awk -F ‘:’ ‘$1 ~/oo/’ passwd

显示第一列带有oo的行

awk -F ‘:’ ‘$3==”0”’ passwd

 

awk -F ‘:’ ‘$3>=500’ passwd

显示第三列大于500的行

awk -F ‘:’ ‘$7!=/sbin/nologin”’

显示第七列不是该目录的行

awk -F ‘:’ ‘$3<$4’ passwd

显示第三列小于第四列的行

head -5 passwd |awk -F ‘:’ ‘{OFS

=”#”} {print $1,$3,$4}’

OFS为输出分隔符,显示前五行,1,3,4列并以#隔开

head -n3 passwd |awk -F ‘:’ ‘{pri

nt NF}’

输出当前记录域的个数

head -n3 passwd |awk -F ‘:’

‘{printNR}’

输出读取前三行的行数

awk ‘NR>3’ passwd

显示读取数据行数大于三的行

awk -F ‘:’ ‘NR<20&&$1 ~/roo/’

表示前二十行并第一列带有roo行

awk -F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ passwd

统计第三列文件长度相加值

awk -F ‘:’ ‘{if($1==”root”)print

$0}}’ passwd

如果第一列值为root,则输出整行

 

 5、正则中需要转义的字符

$,(),*,+,{},[],^,.,|

正则三侠具体怎么发挥作用还需要大量的手动练习,如果本文有什么错误欢迎指出,一起讨论~

猜你喜欢

转载自blog.csdn.net/weixin_42774383/article/details/81328592
今日推荐