您的位置:首页 > 运维架构 > Linux

shell中的文本处理正则表达式(grep,sed,awk,linux中三剑客)

2019-08-19 17:43 871 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Rapig1/article/details/99706667

1.什么是正则表达式

正则表达式,又称为规则表达式,在代码中常简写为regex,regexp或RE,计算机科学的一个概念
正则表达式通常被用来检索,替换那些符合某个模式(规则)的文本
许多程序设计语言都支持利用正则表达式进行字符串操作,例如在Perl内建了一个功能强大的正则表达式引擎
正则表达式这个概念最初是由Unix中的工具软件,例如sed和grep普及开的
正则表达式常缩写成regex,单数由regexp,regex,复数有regexps,regexes,regexen
正则表达式是对字符串操作的一种逻辑公式,用事先定义好的特定字符,及这些特定字符的组合组成一个规则字符串
这个规则字符串用来表达对字符串的一种过滤逻辑

grep文本过滤器命令

grep的工作方式:在一个或多个文件中搜索字符串模板
如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名,搜索的结果被送到屏幕,grep可用于shell脚本,如果模板搜索成功返回0,不成功返回1,搜索文件不存在返回2,我们可以利用返回值做一些自动化的文本处理工作

grep的格式 (贪婪模式的匹配)
grep 匹配条件 处理文件
将/etc/passwd 移动到/mnt下

删除后面的内容

grep root passwd 搜索全文中的root

grep ^root 过滤以root开头

grep bash$ 过滤以bash结尾

grep -i root passwd 忽略大小写

grep -E “root | ROOT" passwd 同时匹配多个条件 相当于egrep使grep扩展,可识别扩展字符

grep -E "root|bash" passwd 搜索同时包含root和bash的行


grep属于贪婪模式的搜索和匹配,只要行中由root的出现,它就会打印匹配行,除非指定开头和结尾

grep不可以直接加两个条件

grep -E 就可以加两个条件,不加E的话就过滤两次,例:过滤root开头且bash结尾的行

grep -i root passwd -v 表示打印与匹配条件相反的行,除了root(忽略大小写)其他的行

cat passwd 查看passwd文件并显示行号

cat -b passwd | grep lp 过滤并查看含lp的行

cat -b passwd | grep lp -2 打印匹配行以及匹配行的上下两行

cat -b passwd | grep lp -A2 打印匹配行以及匹配行后两行

cat -b passwd | grep lp -B2 打印匹配行以及匹配行前两行


grep中的正则表达式
写入实验内容

^westos打印以westos开头的行
westos$打印以westos结尾的行
grep 'w....s'打印w和s中间包括四个字符的行

grep 'w....'打印w开头后面4个字符的行

grep '....s' 打印s结尾前面4个字符的行

grep ws 打印ws的行


grep中字符的匹配次数设定
编辑测试文件

*字符出现0-任意次,打印ab或者ab之间由0-多个任意字符的行

\?字符出现0-1次 打印b前,出现0-1次a

\+字符至少出现1次

\{n\} 字符出现n次 打印b前面a出现两次的行

|{m,n\} 字符最少出现m次,最多出现n次 打印b前a至少出现2次,最多出现3次的行

\{0,n\}字符出现至少0-n次 打印b前a至少出现0-2次的

\{m,\}字符出现至少m次 打印b前a至少出现过2次的行

(xy\)\{n\}xy 关键字出现n次 ab出现4次

.*关键字之间匹配任意字符 a和b之间出现0-多个字符的行

a*b 打印b前面由0-多个a的行


grep中字符的匹配位置设定

^ 关键字 寻找以什么开头的关键字

关键字 $ 寻找以什么结尾的关键字

\< 关键字 以root开头的两边必须是符号或者空的行

关键字 \> 以bash结尾两边必须是符号或者单词空格的行

\<关键字\>  匹配包含bash,bash两边必须是符号或者单词空格的行


==grep 正则表达式与扩展正则表达式

正规的grep不支持扩展正则表达式,|是用于表示或的扩展正则表达式字符,正规的grep无法识别
加上\这个字符就被转译成扩展正则表达式,就像egrep

sed行编辑器
1.sed命令的概念

sed是一项Linux指令,功能通awk类似,差别在于sed简单,对列处理的功能要差一些,awk功能复杂,对列处理的功能比较强大
sed来操作纯ASCII码的文本处理时,把当前处理的行储存在临时缓冲区,称为模式空间,可以指定仅仅处理哪些行
sed符合条件的处理,不符合条件的不处理,处理完后就把缓冲区的内容送至屏幕
接着处理下一行,这样不断重复,直到文件末尾
原来的内容是在磁盘中放着,现在用sed处理就相当于内容掉入内存的一个地方用户处理,这个处理空间就叫模式空间

sed命令格式
调用sed命令由两种形式

sed 		[options]		'command' file
sed		[options]	-f 	 scriptfile file

sed对字符的处理

p 显示
d 删除
a 添加
c 替换
w 写入
i 插入

p模式操作 (按要求显示行)

cp /etc/fstab .
cat -n fstab 显示空行

cat -n fstab | sed 5p 显示第五行并且在原来文件也显示

> cat -n fstab | grep 3,5p 显示3-5行并且原来的文件也显示

cat -n fstab  | sed -n 3,5p 只显示模式空间的内容,不显示原来的文件内容

cat -n fstab | sed -n '3p;5p'  只显示模式空间的3,5行

显示包括#的行

显示不包括#的行

显示空行

显示非空行

显示非空行并且不是以#开头的行


d模式操作

删除#开头的行并且其余的行都显示

删除第五行,并显示其他的行

删除第三行和第五行

删除UUID开头的行


a模式操作 (按照要求添加)

在以UUID开头的行下面加入hello linux

在以UUID开头的行下面加入hello linux


== i模式操作 (按要求插入)

在第四行下面加入hello行linux行

在第四行位置插入hello行 linux行


c操作模式 (按要求改变行)

把#开头的行全部变成westos

把#开头的行全变成westos然后把结果插入fstab中


w模式操作 按要求写入行

将UUID开头的内容写入file文件


sed其他用法

显示以UUID开头的行是第几行,并且不输出原文

不但显示第几行,还显示原文

显示一共有多少行,且输出原文内容

将test中的内容加到fstab文件中的第六行下
vim test


把test中的内容加到fstab的结尾

cat test > fstab 直接导入会覆盖fstab原来的内容

sed '$r test' fstable -i  修改fstable中的内容

awk报告生成器

awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性的工作,然后将结果展现给用户
在命令格式上分别体现如下:
BEGIN{}:读第一行文本前执行,一般用来初始化操作
{}:逐行处理,逐行读如文本执行相应的处理,是最常见的编辑指令
END{}:处理完最后一行文本之后执行,一般用来输出处理
awk是一个优良的文本处理工具,Linux及Unix环境中现有的最强的数据处理引擎之一
用命令可以查看正在应用的awk来源 ls -l /bin/awk


linux上默认适用的是gawk,其余的还有nawk。

awk的基本用法
复制/etc/passwd 到/mnt中 删除掉后面的行数,只留前面

指定分隔符,打印passwd文件以:为分隔符的第一列字符


打印第一列和第一列,不出现:分割符

打印第2列

打印第二列,并且在最前面加上linux,在最后面加上westos

在第二列后面均写上1

打印第二列,并且编号

把编号写在第一列前面

在第一列前面加上编号,并且在底下写入END

在passwd结尾输出行数

在passwd结尾处输入列数

输出包含bash行的第一个字符

passwd第三行

passwd 3456行

passwd4和6行

passwd输出文件名字,有多少行输出多少次

passwd输出行

输出a+12的值

输出以a-d开头的行

输出不是以a-d开头的行

输出以root开头且以bash结尾的行

输出以r开头或者以bash结尾的行

打印第六列含有bin的行

打印第六列不含bin的行

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: