目录
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动作。 |
-r | sed的动作支持的是延伸型正规表示的语法。(预设是基础正规比表示法语法)。 |
-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