1.grep
grep [Globally search a Regular Expression and Print]
grep -E = egrep
grep 格式
grep 匹配条件 处理文件
grep root passwd | 过滤root关键字 | grep -i root passwd | 过滤root关键字,并忽略大小写 |
grep -E "\<root" passwd | root字符之前不能有字符 | grep -E "root\>" passwd | root字符之后不能有字符 |
grep -数字 | 显示过滤行以及上面几行和下面几行 | grep -n | 显示匹配的行所在行号 |
grep -A | 显示过滤行以及下面几行 | grep -B | 显示过滤行以及上面几行 |
grep -v | 反向过滤 |
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次 |
(wl){2} | wl出现两次 | (wl){2,} | wl出现至少两次 |
练习脚本:
请显示系统中能被su命令切换的用户名称grep -e sh$ -e bash $ /etc/passwd | cut -d : -f 1
grep -E "bash$|sh$" /etc/passwd | cut -d : -f 1
2.sed
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r :支持扩展表达式
-i :直接修改文件内容
sed -n -f file passwd
cat file
5p
对字符的处理
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 '/^a/p' fstab 显示以a开头的行
d 删除
sed 5d westos 删除第五行
sed '/^a/d' fstab 把a开头的行删除
sed '/^UUID/!d' fstab 除了UUID以外的行都删除
sed -e '5,$d' westos 删除第五行及以后
a 添加
sed -e '$a hello world' fstab 在最后一行添加hello world
sed -e '$a hello\nworld' fstab 在最后一行添加hello\nworld
sed -e '/^h/a hello world' fstab 在以h开头的行后添加 hello world
c 替换
sed -e '/^a/c hello world' fstab 以a开头的行替换成hello world
sed '5chello world' westos 把第五行替换成hello world
w 把符合的行写到指定文件中
sed '/^UUID/w westofile' westos 把westos中UUID开头的行写入westosfile中
r 整合文件
sed '5r haha' westos 把haha中的内容整合到westos的第5行
sed 字符替换
sed 's/:/###/g' westos 所有的行所有的列都替换
sed 's/:/###/' westos 所有的行的第一列替换
sed '1,5s/:/###/g' westos
sed '1s/:/###/g' westos
sed '1s/:/###/g;5s/:/###/g' westos
sed '/lp/,/shutdown/s/:/###/g' westos
sed 's/\//####/g' westos \为转义
sed 's@/@####@g' westos
sed 's@/@####@g' -i westos 把sed处理的内容保存到westos文件中
练习及脚本
Apache_port.sh
此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!sh Apache_port.sh 8080
apache的端口会被修改为8080
#!/bin/bash
setenforce 0 &> /dev/null
[ -z "$1"] && {
echo "Please input port number following script!!"
exit
}
rpm -q httpd &> /dev/null || {
echo "Error : Apache is not installed !!"
exit
}
systemctl status httpd | grep "running" &> /dev/null || {
echo "Error : Apache is not runing !!"
exit
}
netstat -antlupe | grep -E ":$1\>" &> /dev/null && {
echo "Eror : $1 is in used !!"
exit
}
sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd
netstat -antlupe | grep http
3.awk
awk -F 分隔符 BEGIN{} {} END{} FILENAME
NR | 行数 |
NF | 列数 |
FILENAME | 文件名称本身 |
westos | westos变量值 |
"westos" | westos字符串 |
awk -F : 'BEGIN{print "name"}{print $1}END{print "end"}' /etc/passwd
awk -F : '{print NR}' passwd
awk -F : '{print FILENAME}' passwd (结果为要处理文件的名称)
awk -F : 'BEGIN{westos=1} {westos++} END{print westos}' passwd
awk -F : 'END{print NR}' passwd 显示最后一行的行号
/bash$/ | 条件 |
/条件1|条件2/ | 条件1或者条件2 |
/条件1/||/条件2/ | 条件1或者条件2 |
/条件1/&&/条件2/ | 条件1并且条件2 |
$0 | 所有的列 |
$1 | 第一列 |
$2 | 第二列 |
$3 | 第三列 |
#/etc/passwd文件的第六列没有home关键字并且以bash结尾的行
awk -F : '$6!~/home/&&/bash$/{print}' /etc/passwd
课后练习:
统计在系统中能su切换的并且用户加目录不在/home下的用户数量
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd