8.Linux的正规表达式与文件格式化处理

目录

1.什么是正规表达式?

2.基础正规表达式

2.1.grep的一些进阶阶选项

3.sed工具

4.awk:好用的数据处理工具

5.diff工具:查看档案的差异


1.什么是正规表达式?

正规表示法就是处理字符串的一种方法,他是以行为单位来进行字符串的处理行为, 正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程序,能大大提高系统管理员的效率。

注意:正规表示法与通配符是完全不一样的东西!因为『通配符 (wildcard) 代表的是 bash 操作接口的一个功能』,但正规表示法则是一种字符串处理的表示方式! 

2.基础正规表达式

结合grep来学习正规表达式。

  • 在正规表达式中,一个点 “.”代表一个任意字符的意思。

2.1.grep的一些进阶阶选项

语法:

grep [-A] [-B] [--color=auto] '搜寻字符串' filename

选项

选项含义
-A后面可加数字,为after的意思,除了列出该行外,后续的n行业列出来。
-B后面可加数字,为before的意思,除了列出该行外,前面的n行业列出
--color=auto关键词的进行颜色标注

例子1:

复制:/etc/passwd档案,到/test目录下,然后编辑一下这个档案:

编辑档案:

使用grep命令截取关键字gdm,使用命令:grep gdm passwd --color

正规表达式一个点就代表一个字符,也可以使用命令:grep 'g.m' passwd --color

解释:在passwd档案中找出d和m中有一个字母的字符的那一行,是什么字母无所谓。

那如果找g和m当中有两个字符的呢?使用命令:grep 'g..m' passwd --color

匹配到一行:

例子2:

再次修改一下passwd的档案内容,再复制一行,把gdm改成其中一个是大写的Gdm,试着一下使用命令:grep 'g.m' passwd --color,会不会找到这个关键词的一行。

保存退出编辑,使用命令:grep 'g.m' passwd --color

 使用正规表达式忽字母G的大小写怎么做呢?

使用命令:grep '[Gg].m' passwd --color

例子3:

找到开头为gdm的字符串怎么做呢?使用符号:"^"代表开头的意思。 

提示:  "\<" 也可以表示开头。

使用命令:grep '^gdm' passwd --color

例子4:

找到结尾有gdm这个字符串怎么做呢?使用符号:"$"代表结果的意思。

提示:  "\>" 也可以表示结束。

使用命令:grep 'gdm$' passwd --color

例子5:限定连续字符范围

比如你想寻找一个字符串,gdddddddddddddm的话,我们可以发现里面有13个d,当然你也可以直接使用grep去截取,但是有一种更为便捷的命令:xy\{m\}z,表示xy中间有出现每个z的字符串。

修改一下passwd这个档案,具体来体验一下这个含义:

分别查找gm中间有6,8,10个d的字符串:

使用命令:grep 'gd\{6\}m' passwd --color

寻找gm当中d的个数有6到11个之间的字符串:

使用命令:grep 'gd\{6,11\}m' passwd --color

寻找gm当中d的个数大于3个的字符串:

使用命令:grep 'gd\{3,\}m' passwd --color


3.sed工具

功能:sed 本身也是一个管线命令,可以分析 standard input ! 而且 sed还可以将数据进行取代、删除、新增、截取特定行等等的功能。

语法:

sed [-nefr] [动作]

选项

选型含义
-n使用lilent模式,在一般sed的用法中,所有来自STDIN的数据一般都会被列到屏幕上,如果加上-n参数后,则只有经过sed特殊处理的那一行或者动作才会被列出来。
-e

直接在指令列模式上进行sed的动作编辑,同时多多个操作。

例子,比如替换档案的bin为大写,还要替换档案的usr为大写,使用命令:sed   -e 's/usr/USR/g'  -e 's/bin/BIN/g'  aa

-f直接将sed的动作写在一个档案内,-f filename 则可以执行filename内的sed动作。
-rsed的动作支持的是延伸型正规表示的语法。(预设是基础正规比表示法语法)。
-i直接修改读取档案的内容,而不是由屏幕输出。

动作说明:[n1[,n2]]function

解释:n1,n2:不一定需要,表示选择进行动作的函数,举例子来说,如果我们动作需要在1-10行之内进行的话,则是:[1,10[动作行为]]

 function 的参数功能
c替换,a后面可以接字符串,替换掉含有目标字符串的一行
d删除,后面不跟任何东西。
i插入,i后面可以接字符串,而这些字符串会在新的一行出现(以现在为基准的下一行)。
a插入,i后面可以接字符串,而这些字符串会在新的一行出现(以现在为基准的上一行)。
p打印,将某个选择的数据打印,通常会与参数sed -n 一起使用
s取代,可以直接进行取代工作。

例子1:

复制:/etc 下的hosts档案,到、/test 目录下,然后使用sed 删除第一行和第二行。

使用命令: sed '1,2d' hosts

解释:对第一行和第二行进行操作,动作是删除,注意,这并没有修改源文件,只是把结果显示在屏幕上。

如果想直接写入文件里面,而不是显示在屏幕上面怎么做,使用参数:-i

使用命令: sed  -i  '1,2d' hosts

删除最后一行,使用命令:sed '$d' hosts

例子2:替换

复制:/etc 下的passwd档案的头五行,到/test目录下的aa档案

使用命令:head  -5 /etc/passwd > aa

把这个档案额所有usr字符换成大写的。

使用命令:sed 's/usr/USR/g'  aa

例子3:连续替换,使用 -e 选项

复制:/etc 下的passwd档案的头五行,到/test目录下的aa档案

使用命令:sed   -e 's/usr/USR/g'  -e 's/bin/BIN/g'  aa

例子4:

使用aa档案,找到含有sys的一行,然后再他的上一行添加字符串“mmmmmmmmmmmmmm”

使用命令:sed '/sys/i  mmmmmmmmmmmmmmm'    aa

 

例子5:

使用aa档案,找到含有sys的一行,然后把这一行替换成字符“mmmmmmmmmmmmmm”

使用命令:sed '/sys/c  mmmmmmmmmmmmmmm'    aa

例子6:我们可以把我们所要做的一些操作写入一个档案里,然后执行这个档案的内容,就可以做相应的修改。

比如,1.找到有找到含有sys的一行,然后再他的上一行添加字符串“mmmmmmmmmmmmmm”,2.找到含有sys的一行,然后再他的下一行添加字符串“mmmmmmmmmmmmmm”3.把usr全部改大写的   4.把bin全部改成大写的。

首先新建一个档案,命名为:changefile

然后编辑如下:

接着使用 -f 参数调用刚才的changefile 档案

使用命令:sed -f changefile aa

解释:修改的档案为a,使用的命令为:sed,改变的指令从changefile里面取用。


4.awk:好用的数据处理工具

功能:awk 也是一个非常棒的数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数『字段』来处理。因此,awk 相当的适合处理小型的数据处理。从一个文件里面找到感兴趣的内容,然后进行重新排版。

语法

awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename

提示:awk 主要是处理『每一行的字段内的数据』,而默认的『字段的分隔符为 "空格" 或 "[tab]键" 』(使用-F可以指令分隔符),如果读出一行没有空格或者tab键的话,awk会认为这是一部分,不会把这一行进行分割。

例如我有一个档案,里面的内容如下,那么具体的关系就如下图

awk内建变量 

变量含义
NF每一行($0)拥有的字段数
NR目前awk所处理的是第几行数据
FS目前的分隔符,默认是空格

awk逻辑运算字符

运算单元含义
>大于
<小于
>=大于或等于
<=小于或等于
==等于
!=不等于

 

例子1:内建变量的使用

例子2:使用$0显示的是每一行的名字,不进行分段

 

例子3:

我们看看网卡配置的档案:

如果我仅仅想提出档案标注位置的数字:1,如何做呢?

首先,使用管道传输结果,然后提取有inet6的一行:

使用命令:ifconfig | grep 'inet6'

得到的结果再次通过管道传输给awk,默认使用空格作为分隔符,那我们取他的第二段出来,然后打印,得到结果:

使用命令:ifconfig | grep 'inet6' | awk '{print $2}'

我们需要提取到的是1,那么再次通过管道传输给awk,这次需要指定分隔符,使用冒号为分隔符,然后提取第3个字段的数据:

使用命令:ifconfig | grep 'inet6'|awk '{print $2}' |awk -F : '{print $3}'

例子4:如果想得到date这个命令的秒数

使用命令:date|awk '{print $4}'|awk -F: '{print $3}'

 

例子5:使用条件进行匹配

先看看aa档案的内容:

我打印第一个字段的内容,如果使用命令:awk -F: '{print $1}' aa,那么所有第一字段都会显示出来

 

现在我需要匹配一个条件:就是第三个字段小于等于2的那一行的第一字段我才回显示出来。

使用命令:awk -F: '$3<=2{print $1}' aa

例子6:使用自定义格式查看档案

现在看以西a档案的内容,现在这样子看起来好像很乱,因为说有的内容都是贴在一起的,那如何变得容易看呢:

假如我想要字段之间使用tab键分开,然后行之间使用两个空格键分开,然后只查看前四个字段,怎么做呢?

提示:使用OFS可以指令字段之间的间隔,使用ORS可以指定行之间的间隔。

使用命令:awk -F:  'BEGIN{OFS="\t";ORS="\n\n"}{print $1,$2,$3,$4}'  aa

这样子看起来是不是清晰明了了呢。


 

5.diff工具:查看档案的差异

语法:

diff [-bBi] from-file to-file

注意:from -file一个档案名,原始对比档案,to-file作为目的对比档案

选项

选项含义
-b忽略一行当中,仅有多个空白的差异。
-B忽略行与行之间空白的差异
-i忽略大小写的不同

例子:

接着上面的aa档案,然后把aa档案复制一下,命名为bb,然后比较一下两个的内容是不是一样

使用命令:diff aa bb

没有任何提示就是一样的

现在修改一下bb的内容:

再次使用命令:diff aa bb


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值