1 grep
命令 | 含义 |
---|---|
grep | 标准正则表达式 |
egrep = grep -E | 扩展正则表达式 |
1.1 grep格式
格式:grep 匹配条件 处理文件
命令 | 含义 |
---|---|
grep root passwd | 过滤root关键字 |
grep ^root passwd | 以root开头的 |
grep root$ passwd | 以root结尾的 |
grep -i root passwd | 忽略大小写 |
grep -E “<root” passwd | root字符之前不能有字符 |
grep -E “root>” passwd | root字符之后不能有字符 |
grep -数字 | 显示过滤行以及上面几行和下面几行 |
grep -n | 显示匹配的行所在的行号 |
grep -A | 显示过滤行以及下面几行 |
grep -B | 显示过滤行以及上面几行 |
grep -V | 反向过滤 |
1)复制文件作为实验素材:
编辑该文件,删除部分内容:
2)西面命令分别表示,将含有root的过滤出来;不区分大小写的过滤;反向过滤,不含root的;
3)grep在过滤的时候是贪婪过滤,含有root的都会过滤出来,想要过滤只含root前面或后面没有其他字符的,可以使用下面的命令:
4)过滤root在第一个的;过滤root在最后一个的,因为没有root在最后,所以没有显示结果:
5)过滤root不在第一或不再最后的:
6)过含有mail的行;过滤mail上下五行;过滤mail的前面五行;过滤mail后面五行
查看mail所在的行号:
1.2 grep字符数量匹配规则
表示方法 | 含义 |
---|---|
^westos | 以westos开始 |
westos$ | 以westos结尾 |
w…s | w开头s结尾中间4个任意字符 |
…s | s结尾前面5个任意字符 |
* | 字符出现任意 |
? | 0到1次 |
+ | 1次到任意次 |
{n} | n次 |
{m,n} | m到n次 |
{0,n} | 0-n次 |
{,n} | 0-n次 |
{m,} | 最少m次 |
(ed){2} | ed字符串出现两次 |
1)建立实验素材,过滤时一个点代表一个字符:
2)*表示中间可以有无数个;?表示出现0-1次:
3)e至少出现1次;e出现1-3次;e至少出现4次;e至多出现两次:
4)ed出现任意多次;ed至少出现一次;+表示ed出现一次到任意次,但不能是0次,*表示任意多次可以出现0次;e出现一次到任意次:
1.3 练习脚本
请显示系统中能被su命令切换的用户名称:
2 sed
命令格式:
- sed 参数 命令 处理对象
- sed 参数 处理对象 -f 处理规则文件
2.1 对字符的处理
s代表替换;g表示全局,不叫g默认是替换每一行的第一个 ;默认改了是不会保存的,加-i是修改并保存到原文件中;-e的作用: 高级匹配,可以使用更复杂的正则表达式
- p --> 显示
命令 | 含义 |
---|---|
sed -n 5p westos | 显示第五行 |
sed -n 3,5p westos | 显示三到五行 |
sed -ne 3p;5p westos | 显示三和五行 |
sed -ne 1,5p westos | 显示1-5行 |
sed -ne ‘5,$p’ westos | 五到最后一行 |
sed -n ‘/^#p’ westos | 显示以#开头的行 |
1)将passwd中的sbin替换成westos,注意这是临时的,显示出来的内容变了,但实际上并没有保存到文件中:
查看原文件,内容并未发生改变:
2)上一条命令也可以,在文件中写入规则,然后执行规则,效果一样:
3)显示第5行,没有行号不方便看实验效果,所以将文件加上行号,使用-b参数实现:
显示第5行;显示5-7行;显示第五行和第七行;显示第五行到最后
显示第一行到第五行:
显示有bash的行:
- d --> 删除
命令 | 含义 |
---|---|
sed 5d westos | 删除第五行 |
sed ‘/^#/d’ fstab | 把#开头的行删除 |
sed ‘’^UUID/!d’ fstab | 除了UUID以外的行都删除 |
sed -e ‘5,$d’ westos | 第五行之后的,都删除 |
1)删除第五行;删除第五行以及第五行之后:
2)将有含bash的行删除:
3)建立实验素材:
删除该文件里面的空行:
将空行删除,然后保存到文件;在第一行添加hello westos,并保存在文件中:
- a --> 添加
命令 | 含义 |
---|---|
sed -e ‘$a hello word’ fstab | 最后一行添加 |
sed -e ‘$a hello\word’ fstab | 将hello和word换行在最后一行添加 |
sed -e‘/^#/a hello word’ fstab | 所有以#开头的行后面添加 |
1)在第一行添加hello westos,并保存在文件中:
2)给以#开头的行添加:
3)给最一行添加:
- c --> 替换
命令 | 含义 |
---|---|
sed -e ‘/^#/c hello word’ | 所有以#开头的行都换成hello word |
sed -e ‘5chello word’ | 将第5行换成hello word |
将以#开头的行替换成hello westos:
- w --> 把符合的行写入指定文件中
命令 | 含义 |
---|---|
sed ‘/^UUID/w file’ westos | 把westos中UUID开头的行写到副ile中 |
把符合以#开头的行,写到指定的westos文件中:
- i --> 插入
命令 | 含义 |
---|---|
sed ‘5ihello’ westos | 在第五行插入 |
在第一行前插入hello westos:
- r --> 整合文件
命令 | 含义 |
---|---|
sed ‘5r haha’ westos | 将westos文件插入到haha文件的第五行 |
整合文件 ,将fstab文件插入到westos文件的第二行:
- 字符替换
1)替换全文的#为空:
2)将前面有#的显示出来:
3)将冒号替换成空,不加g默认是替换每一行的第一个:
加了g表示将全局的‘:’都替换成空:
4)将全文的sbin替换成westos:
将1到5行的sbin替换成westos:
第五行之后的sbin都换成westos:
从lp到mail之间的sbin都替换成westos:
将sbin都替换成westos;nologin都替换成liu:
5)想要替换‘/’时,不能直接如下面第一条命令这样写,它是特殊字符,需要转译,如下第二条命令:
该命令中的@和/作用相同,可以相互替换使用:
6)-i参数表示修改并保存到文件中:
2.2 练习脚本
编辑一个脚本,在后面写入数字,http的端口就会改为此数字
3 awk
用法:awk -F 分割副 BEGIN{ }{ } END{ } filename
举例:awk -F : ‘$6!~/home/&&/bash$/{print}’ /etc/passwd
表示/etc/passwd文件的第六列,没有home关键字并且以bash结尾的行。
命令 | 含义 |
---|---|
NR | 行数 |
NF | 列数 |
FILENAME | 文件名称本身 |
westos | 不加引号,默认是变量 |
“westos” | 加了引号表示字符串 |
1)-F是指定分割副为‘:’,打印第一列,不指定时分割副时,默认时以空格作为分割副的:
2)打印全部列:
3)打印第二列:
4)在开始处打印WESTOS,这里之所以没有打印是一位内WESTOS没有加双引号,这样会被当作是一个参数而不是一个字符串:
加上双引号就打印出来:
5)在结尾处打印END:
6)打印行数:
打印列数:
7)打印文件名称:
bash$ 条件
/条件1|条件2/ ## 条件1或者条件2
/条件1||条件2/ ## 条件1或者条件2
/条件1&&条件2/ ## 条件1并且条件2
$0 ##表示该脚本名称
$1 ##第一列
$2 ##第二列
$# ##所有参数个数
$* ##所有参数,该符号会把所有参数看做一个整体
$@ ##所有参数,该符号会把每个参数分别看待
$? ##最后一次执行命令的返回状态
1)//里面写的是条件,$表示以bash结尾的打印出来第一列和第七列:
2)条件是以bash结尾或者有root的打印第一列和第七列:
3)条件是以bash结尾而且有root的打印第一列和第七列:
4)条件是以bash结尾或者有root打印第一列和第七列:
5)第七列是/bin/bash的,打印所有的列:
3.1 练习脚本
统计在系统中能su切换用户并且用户家目录不在/home下的用户数量