1.grep
grep
grep -E = egrep 查找指定的字符串
##grep 格式##
grep 匹配条件 处理文件
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 ##反向过滤
过滤出不含有chroot的行
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次
(lee){2} ##lee字符串出现2次
从westos 文件中过滤出w开头出现ab字符最少一次的字符
练习脚本:
请显示系统中能被su命令切换的用户名称
2.sed
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
对字符的处理
p ##显示
sed -n 5p westos ##显示第五行
sed -n 3,5p westos ##显示3到5行
sed -ne "3p;5p westos ##显示3和5行
sed -ne 1,5p westos ##1-5行
sed -ne '5,$p' westos ##5到最后一行
sed -n '/^#/p' fstab ##显示以#开头的行
显示fstab文件中不以#开头的行并且一开始就结束的行以外的其余行
sed -n '$p' fstab | sed -n '/^$/!p' ##显示最后一行(不显示空行)
sed -n '$=' fstab ##显示总共多少行
sed -n '$p' fstab ##显示最后一行
d ##删除
sed 5d westos ##删除第五行
sed '/^#/d' fstab ##把#开头的行删除
sed '/^UUID/!d' fstab ##除了UUID以外的行都删除
sed -e '5,$d' westos
删除第五行 删除3-5行
删除三和五行
把#开头的行删除
a ##添加
sed -e '$a hello westos' fstab
sed -e '$a hello\nwestos' fstab
sed -e '/^#/a hello westos' fstab
以#开头的行添加hello westos
在最后一行添加
在最后一行添加并且换行
i 为插入到之前 sed '$ihello westos' westos ##在最后一行之前插入
在第一行之前插入
c ##替换
sed -e '/^#/c hello westos' fstab
sed '5chello world' westos
把#开头的行替换成hello westos
把第五行换成hello westos
w ##把符合的行写到指定文件中
sed '/^UUID/w westofile' westos ##把westos中UUID开头的行写入westosfile中
sed '/^#/w file' fstab 等价于sed '/^#/p' > file ##把#开头的行写入到file中
r ##整合文件
tac ##将文件反向输出
sed '/1/rlinux' westos ##将linux内容 整合到westos的第一行后
sed 's@/@####@g' -i westos ##把sed处理的内容保存到westos文件中
字符替换
sed 's/sbin/westos/g' passwd
sed 's/:/ /g' passwd
sed 's/:/ /' passwd
sed '1,5s/:/ /g' passwd
sed '/lp/,/halt/s/:/ /g' passwd
sed '$s/:/ /g' passwd sed 's/:/ /g' passwd
sed 's/:/ /g;s/sbin/westos/g' passwd
sed 's/:/ /g;s/\//##/g' passwd
sed 's/:/ /g;s@/@##@g' passwd
g 表示所有关键字的列,如果不写默认每行出现的第一列
将全文sbin替换成westos
将全文的:替换成空格
将第一列的:替换成空格
将1-5行的:替换成空格
将lp到halt字符之间的:替换成空格
将最后一行的:替换成空格
将全文的:替换成空格并且把全文的sbin换成westos
将全文的:替换成空格并且把全文的/换成##
练习及脚本
Apache_port.sh
此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!
sh Apache_port.sh 8080
apache的端口会被修改为8080
3.awk
逐行读取文本,默认以空格为分隔府进行分隔
awk -F 分隔符 BEGIN{ }{ }END{ } FILENAME
NR #行数
NF #列数
FILENAME #文件名称本身
westos #westos变量值
“westos” #westos字符串
BEGIN ##运行处理策略之前做的动作END ##处理结束所作的事情
/bash$/ #条件
/条件1|条件2/ #条件1或者条件2
/条件1/| |/条件2/ #条件1或者条件2
/条件1/&&/条件2/ #条件1并且条件2
$0 #所有的列
$1 #第一列
$2 #第二列
$3 #第三列
awk -F : 'BEGIN{print "westos"}{print $2}END{print "end"}' passwd ## 开始先输出westos之后逐次输出每行的第二列 处理完所有的行之后打印end
awk -F : 'BEGIN{N=0}{N++}END{print N}' passwd ##设定N=0,每处理一行N+1,之后打印N值
awk -F : 'BEGIN{N=0}/bash/{N++}END{print N}' passwd ## 显示出现bash的行号
awk -F : 'BEGIN{N=0}/bash/{N++;print $7}END{print N}' passwd ##显示出现bash的行号并输出第七列
awk -F : 'BEGIN{N=0}/bash/{N++;print $0}END{print N}' passwd ##显示出现bash的行号并输出整行
awk -F : 'BEGIN{N=0}!/bash/{N++;print $0}END{print N}' passwd ##显示没有bash字符的所有行
awk -F : 'BEGIN{N=0}/bash|nologin/{N++;print $0}END{print N}' passwd ##显示出现bash或者nologin的所有行
awk -F : 'BEGIN{N=0}/^root/&&/bash$/{N++;print $0}END{print N}' passwd ##显示以root开头,以bash结尾的所有行
awk -F : 'NR==1{print $0}' passwd ##输出第一行
awk -F : 'NR==2{print $0}' passwd
awk -F : '{print NR}' passwd ##输出所有行的行数
awk -F : '{print NF}' passwd ##输出列数
awk -F : 'BEGIN{WESTOS=1}{print "WESTOS"}' passwd ##每行都输出WESTOS
awk -F : '$7!~/bash/{print $0}' passwd ##输出第七列不是bash 的所有列
awk '{print "date"}' passwd | bash ##每行输出date 之后在bash中执行
练习:
统计在系统中能su切换的并且用户加目录不在/home下的用户数量