Linux 入门(五)grep, sed, awk 的用法与正则表达式

内容来源于“实验楼”,经过学习整理成文档

1 正则表达式

*匹配前面的子表达式零次或多次
例如"boy|girl"可以匹配"boy"或者"girl"
+匹配前面的子表达式一次或多次
例如,“goo+gle”,可以匹配"gooogle",“goooogle”
? 匹配前面的子表达式零次或一次
例如,“colou?r”,可以匹配"color"或者"colour"
x|y 匹配x或y,| 表示选择
例如"boy|girl"可以匹配"boy"或者"girl"
() 表示范围,“gr(a|e)y"等价于"gray|grey”
[xyz] 匹配所包含的任意一个字符
[a-z] 匹配指定范围内的任意字符
[^a-z] 匹配任何不在指定范围内的任意字符

2 grep 用法

grep 支持三种正则引擎,分别用三个参数指定
-E POSIX扩展正则表达式,ERE
-G POSIX基本正则表达式,BRE
-P Perl正则表达式,PCRE
grep 的常用参数:
-b 将二进制文件作为文本来进行匹配
-c 统计以模式匹配的数目
-i 忽略大小写
-n 显示匹配文本所在行的行号
-v 反选,输出不匹配行的内容
-r 递归匹配查找
-A n n为正整数,表示after的意思,除了列出匹配行之外,还列出后面的n行
-B n n为正整数,表示before的意思,除了列出匹配行之外,还列出前面的n行
color=auto 将输出中的匹配项设置为自动颜色显示

2.1 使用基本正则表达式(BRE)实例:

数量相关:

# 将匹配以'z'开头以'o'结尾的所有字符串
$ echo 'zero\nzo\nzoo' | grep 'z.*o'
# 将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串
$ echo 'zero\nzo\nzoo' | grep 'z.o'
# 将匹配以'z'开头,以任意多个'o'结尾的字符串
$ echo 'zero\nzo\nzoo' | grep 'zo*'

选择相关:

# grep默认是区分大小写的,这里将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[a-z]'
# 将匹配所有的数字
$ echo '1234\nabcd' | grep '[0-9]'
# 将匹配所有的数字
$ echo '1234\nabcd' | grep '[[:digit:]]'
# 将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[[:lower:]]'
# 将匹配所有的大写字母
$ echo '1234\nabcd' | grep '[[:upper:]]'
# 将匹配所有的字母和数字,包括0-9,a-z,A-Z
$ echo '1234\nabcd' | grep '[[:alnum:]]'
# 将匹配所有的字母
$ echo '1234\nabcd' | grep '[[:alpha:]]'

2.2 使用扩展正则表达式(ERE)实例:

要通过grep使用扩展正则表达式需要加上-E参数,或使用egrep。
数量相关:

# 只匹配"zo"
$ echo 'zero\nzo\nzoo' | grep -E 'zo{1}'
# 匹配以"zo"开头的所有单词
$ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'

选择相关:

# 匹配"www.shiyanlou.com"和"www.google.com"
$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E 'www\.(shiyanlou|google)\.com'
# 或者匹配不包含"baidu"的内容
$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com'

3 sed 流编辑器用法

3.1 sed 参数:

-n 安静模式,只打印受影响的行,默认打印输入数据的全部内容
-e 用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数
-f 指定执行filename文件中的命令
-r 使用扩展正则表达式,默认为标准正则表达式
-i 将直接修改输入文件内容,而不是打印到标准输出设备

3.2 sed 常用命令:

s 行内替换
c 整行替换
a 插入到指定行的后面
i 插入到指定行的前面
p 插入到指定行的前面
d 插入到指定行的前面

3.3 操作命令

打印指定行:

# 打印2-5行
$ nl file | sed -n '2,5p'
# 打印奇数行
$ nl file | sed -n '1~2p'

行内替换:

# 将输入文本中"shiyanlou" 全局替换为"hehe",并只打印替换的那一行,注意这里不能省略最后的"p"命令
$ sed -n 's/shiyanlou/hehe/gp' passwd

删除某行:

$ nl file | grep "shiyanlou"
# 删除第30行
$ sed -i '30d' file

4 awk 文本处理语言

4.1 awk 命令的基本格式

awk [-F fs] [-v var=value] [-f prog-file | ‘program text’] [file…]
其中-F参数用于预先指定前面提到的字段分隔符(还有其他指定字段的方式) ,-v用于预先为awk程序指定变量,-f参数用于指定awk命令要执行的程序文件,或者在不加-f参数的情况下直接将程序语句放在这里,最后为awk需要处理的文本输入,且可以同时输入多个文本文件

4.2 awk 常用的内置变量

filename 当前输入文件名,若有多个文件,则只表示第一个。如果输入是来自标准输入,则为空字符串
$0 当前记录的内容
$N N表示字段号,最大值为NF变量的值
FS 字段分隔符,由正则表达式表示,默认为" “空格
RS 输入记录分隔符,默认为”\n",即一行为一个记录
NF 当前记录字段数
NR 已经读入的记录数
FNR 当前输入文件的记录数,请注意它与NR的区别
OFS 输出字段分隔符,默认为" “空格
ORS 输出记录分隔符,默认为”\n"
其他具体使用参考 awk 文档,后面会继续学习

发布了5 篇原创文章 · 获赞 7 · 访问量 2199

猜你喜欢

转载自blog.csdn.net/fengyang182/article/details/104199494
今日推荐