一、grep(正则表达式)
- 全称:Globally search a Regular Experssion and Print
grep -E (扩展正则表达式) - 过滤以bash结尾的行
过滤以bash结尾或以nologin结尾的行
passwd文件内容如下
过滤root关键字(可以看到chroot也被过滤出来的,grep的贪婪模式,只要包含指定字符串,就过滤出来);
-i:忽略大小写;
grep -E “<root” passwd :root字符之前不能有字符;
grep -E “root>” passwd :root字符之后不能有字符
grep -5 :显示过滤行以及上面5行和下面5行
grep -n :显示匹配的行所在行号;
grep -A 5:显示过滤行以及下面5行;
grep -B 5:显示过滤行以及上面5行
grep -v :反向过滤;
显示root在中间的行(过滤出来除了以root开头和root结尾的行)
westos文件内容如下;
w.s :w开头s结尾中间有1个任意字符
*:字符出现任意;
w.{4}s :w开头s结尾中间有4个任意字符
w.{1,}s :w开头s结尾中间最少有1个任意字符;
w.{1,3}s :w开头s结尾中间有1-3个任意字符;
w.?s :w开头s结尾中间有0到1个任意字符
w.+s:w开头s结尾中间有1个到任意个;
we{,3}s:w开头s结尾中间的e字符出现0-3次
w(eb){,3}s:w开头s结尾中间的eb字符串出现0-3次
- 练习脚本:请显示系统中能被su命令切换的用户名称
二、sed
-
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件 -
passwd文件内容如下
查看passwd内容,并对每行前面进行编号(除了空行),重定向到wesostest文件
head、tail命令查看第一行和最后一行
-
p:显示
sed -n 5p westos :显示第五行;不加-n会显示所有内容,并将第五行多显示一次
显示root所在的行;
显示第三行和第五行
显示最后一行;
显示第一行
显示3-5行;
显示7-最后一行
-
d:删除
删除第五行;
删除root所在的行
删除第五行和最后一行
-
a:添加
在第五行后面添加内容;
在含有root的行后面添加内容
在第二行后添加内容(含有换行)
-
i:插入
在第一行/最后一行之前插入内容
-
c :替换
将第一行的内容替换为hello world;
将含有root的行替换为hello world;
-
w:把符合的行写到指定文件中
把含有root的行写入file中
两个文件内容如下
cat命令将两个文件整合(顺序不同,结果不同)
两个>表示追加:
将file文件内容追加到westostest文件之后,此时westostest文件内容发生变化
-
r:整合文件
将file文件的内容整合到westostest文件的第五行之后
此时westostest文件内容未发生变化
-i:把sed处理的内容保存到westostest文件中
-
sed 字符替换
将/etc/passwd 文件复制到/mnt目录,作为实验;
westos文件内容如下
将所有的:替换为###
在每行前面加序号
将换行符转换为空格(由于sed是逐行检测的,要加入N,否则命令不起作用)
将输出的内容重定向到westos文件中;
删除每行最前面的数字
每行后面都加一个空行;
只有最后一行后面加空行;
只有最后一行后面不加空行;
将1-5行的:转换为%%输出
将第一行和第五行的:转换为%%输出(两种方法)
将daemon和lp所在的行的:转换为%%输出
将所有的/转换为###(斜杠需要转译)(两种方法)
将第五行和最后一行的内容删除,并输出;
除了以10开头的行以外的行都删除
-
练习及脚本:Apache_port.sh
此脚本接入数字,http的端口就改为此数字,假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!
sh Apache_port.sh 8080
apache的端口会被修改为8080 -
查看端口现在运行的情况 (httpd服务正在使用)
脚本内容如下
测试
此时httpd服务的主配置文件的端口号已改变
三、awk
awk -F 分隔符 BEGIN{}{}END{} FILENAME
NR :行数
NF :列数
FILENAME :文件名称本身
westos :westos变量值
“westos” :westos字符串
$0 #所有的列
$1 #第一列
$2 #第二列
$3 #第三列
- westos文件内容如下
在westos文件最开始加上westos字符串,最后加上end字符串,打印设定完成后的文件第一列
统计文件行数;
显示第一列;
显示以bash结尾的第一列
以bash结尾并且不含有root的行;
以bash结尾或者含有root的行;
以bash结尾或者含有ftp的行
westos文件的第7列含有bash关键字,则显示相应的第一列;
westos文件的第7列不含有bash关键字,则显示相应的第一列;
westos文件的第7列不含有bash关键字,则显示相应的所有列;
westos文件的第六列没有root关键字并且以sync结尾的行,显示第一列;
westos文件的第六列没有root关键字或者以sync结尾的行,显示第一列;
awk -F : ‘!/root/|/sync$/{print ¥1}’ westos:不含有root关键字并且不以sync结尾,显示第一列
- 课后练习:
1、统计在系统中能su切换的并且用户家目录不在/home下的用户数量
方法一:脚本内容如下
方法二:
2、计算系统当前所使用的内存总和 - 指定显示进程的内存信息
将第一行和含有0.0的行过滤掉
脚本内容如下;
$1: 传入脚本的第一个参数