基础正则表达式
上图一定记住正则表达式是在文件中搜索字符串,通配符是在系统中搜索文件名
完全匹配就是内容必须一模一样才会列出,但是包含的内容没有,包含匹配就是搜索的内容只要包含在字符串这一行内就会列出。
写一个文件如下图
上图倒数第二个和倒数第三个记倒数第三个就行
比如上图第一个,a*
代表一个a都没有或者一个a,或者n个a,*
前面必须有内容
正则表达式的.*
和通配符的*
是一个作用
字符截取命令
上图printf
是awk
中需要用到的一个命令,严格上说不算字符提取命令
grep
是在文件当中提取符合条件的行,cut
和awk
就是提取列
注意上图ID
和Name
那一行互相之间空的绝对不能是空格,而是应该是制表符(Tab),不然的话cut
不能正确继续。
上图分隔符是制表符,即tab
下图为vim /etc/passwd
上图提取出来新增加的三个用户的行,用户的shell都是/bin/bash
,最后反转去掉root,因为root不能删。
下图这样就提取出来了,后面用循环的方式删除
这就是cut
和grep
最主要的左右,在文本当中提取出需要的字段,当然cut
不能独立使用,一般都是通过管道符的方式与grep
联合使用如下图
比如说我想写一个脚本,用这个脚本来判断根分区的使用率,如果使用率超过80%,我的程序让它报警,告诉管理员。 (看下图第三行),那如何提取那一行那一列?看下下图
注意cut
默认分隔符是tab,如果不是就无法提取如下下图
如果是空格作为分隔符就需要用awk
命令来实现列提取,但是awk
远比cut
复杂,如果cut
能够实现的功能,即分隔符用tab,冒号,句号
这些分隔的,就用cut
如上图因为分隔符有空格,所以df -h
的结果cut
不能处理。
awk
功能很强大,一般不叫awk
命令,而叫awk
编程,它里面可以实现流程控制,条件判断,甚至可以实现变量赋予
printf命令(格式化打印命令)
printf
是最常用在awk
这个字符列提取命令当中的标准输出格式
三个%s
代表每三个字符串输出一次。
如下图,printf
命令不能直接加文件名,也不能通过管道符来接收第一条命令的执行结果。它只能用下下图这种方式
所以printf
远没有echo/cat
输出文件内容方便,我们学习是因为这是awk
编程中最基本的命令输出方法。在awk
中不能直接调用系统命令echo/cat
。
awk编程
awk作用就是和cut
一样,截取符合条件的列,grep
是截取符合条件的行
如上图用cut
截取df -h
的第五列,它会认为每一个空格符就是一个真正的字段,所以截取的是一个空。所以cut
是不能在空格作为分隔符的文件内容当中或者命令输出结果当中来进行截取操作。它只能识别tab
或者具体的分隔符比如冒号,如果想截取空格作为分隔符的文件内容的话,必须用awk
命令
cut
有的功能awk
都有,只是awk
用法特别复杂,能用cut
就用cut
如上图没写条件就代表任何条件都执行,$2
代表这个文件第二列,$6
代表文件第6列
awk
虽然提取列,但读取数据的时候是一行一行读入的
如上图提取出纯数字是为了后面流程控制判断语句,循环语句之类的用
上图 BEGIN是一个条件,意思是开始,只有满足了这个条件,动作才会执行。BEGIN的作用是在所有的数据读取之前执行它后面那条命令,然后再处理后边的数据。上图即第二个printf
,它前面无条件,只要有数据就原封不动输出。
如上图FS
的作用就是指定分隔符,awk
默认能够识别的分隔符是制表符或者是空格,在/etc/passwd
里面默认分隔符是冒号,所以专门声明
如上图第一行没有处理,第二行开始才处理,这是因为awk
处理的时候是先读入第一行数据,然后再执行条件,也就是说在指定分隔符之前这个数据以及读入,所以第一行它认为默认是空格作为分隔字符
如果想避免上面的情况用下图
加一个BEGIN,先读入分隔符
END
的作用就是所有的数据处理完之后执行一条END命令,如下两图
awk
没有shell
方便,所以学习awk
掌握其字符截取作用就可,其他编程如流程控制以及,循环判断语句之类的用shell
实现就行
字符截取命令之sed
sed
其实不是截取命令
vi
命令只能修改文件,但是vi
不能把命令的结果直接修改,如下图,不能直接修改df
结果的命令,必须将其写入一个文件才能用vi
修改。而sed
支持管道符操作,所以不光可以修改文件的内容,还可以直接修改命令的结果,这是vi
和sed
最主要的区别
上图的字符替换不影响文件本身,若想改变文件本身加-i
如下图
sed
最主要作用就是处理命令输出,不要写入文件,如果需要修改文件内容最好还是用vi
如果s
前面没加行号代表整篇文档