SHELL脚本中的文本处理工具(grep,sed,awk)
grep
过滤关键字符
grep -e=egrep
grep参数
vim file
grep westos file:过滤westos关键字
grep ^westos file :过滤以westos开头的关键字
grep westos$ file :过滤以westos结尾的关键字
grep -i westos file:过滤westos关键字并且忽略大小写
grep -E “\<westos” file:过滤westos关键字并且前边不能有字符
grep -E “\westos\>” file:过滤westos关键字并且后边不能有字符
grep -数字:显示过滤行下面几行以及上面几行
grep -n :显示过滤行所在行号
grep -A:显示过滤行以及下面几行
grep -B:显示过滤行以及上面几行
grep -v :反向过滤(除了关键字符其余都显示)
grep字符数量匹配规则
vim file
^westos:以westos开头
westos$:以westos结尾
w…s:以w开头s结尾中间任意四个字符
…s:以s结尾前边任意五个字符
*:字符出现任意一次
?:0-1次
+:1到任意次
{n}:指定次
{m,n}:m到n次
{0,n}:0到n次
{,n}:0到n次
{m,}:最少m次
(ab){2}:ab字符串出现两次
vim file
练习脚本:显示系统中能被su命令切换的用户名称
sed
命令格式
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
对字符的处理
实验文件:cp /etc/passwd .
cat -n passwd | tee passwd
vim passwd
p:打印,显示
sed 5p passwd
-n:不显示其他内容
sed -n 3,5p passwd:显示第三行到第五行的内容
sed -ne “3p;5p” passwd:显示第三行和第五行的内容
sed -ne ‘5,$p’ passwd:显示第五行到最后一行
sed -n ‘/^#/p’ /etc/fstab:显示以#开头的行
d:删除
ded 5d passwd:删除第五行
sed ‘/^#/d’ fstab :删除#开头的行
sed ‘/^UUID/!d’ fstab:除了UUID开头的行删除
sed ‘3,$d’ passwd :删除第三行到最后一行
sed ‘3d;$d’ passwd:删除第三行和最后一行
a:添加
sed -e ‘$a hello linux’ fstab :在最后一行添加hello linux
sed -e ‘$a hello\nlinux’ fstab:在最后一行换行加入hello linux
sed -e ‘/^#/a hello linux’ fstab:在所有#开头的行加入hello linux
c:替换
sed -e ‘/^#/c hello linux’ fstab:把所有以#开头的行替换成hello linux
sed ‘5c hello linux’ passwd:把第五行替换成hello linux
w:写入(覆盖)
sed ‘/^UUID/w passwd’ fstab:把fstab中以UUID开头的行写入到passwd中(覆盖)
i:插入
sed ‘1i hello westos’ fstab:在第一行插入hello westos
r:整合
sed ‘5r fstab’ passwd:把fstab整合到passwd文件的第五行
-i:导入
sed ‘1i hello linux’ -i fstab:在fstab第一行前插入hello linux 并导入fstab文件
sed字符替换
sed ‘s/????#/g’ passwd :把passwd全文的:替换成#
sed ‘s/: /#/’ passwd:把passwd全文第一个:替换成#
sed ‘5s/: /#/g’ passwd :把第五行的:替换成#
sed ‘1,5s/: /#/g’ passwd:把第一行到第五行的:替换成#
sed ‘1s/: /#/g;5s/: /#/g’:第一行和第五行的:替换成#
sed ‘s/ \ //#/g’ passwd :把全文的/替换成#
sed ‘[email protected]/@#@g’ passwd :把全文的/替换成#(@=/)
练习脚本:Apache_port.sh
此脚本后介入数字
http的端口就改为此数字
假设selinux为关闭状态
vim Apache_port.sh
脚本测试
awk
awk -F 分隔符 BEGIN{ }{ }END{ } FILENAME
默认分隔符为空格
NR:行数
NF:列数
FILENAME:文件名称本身
westos:westos变量值
“westos”:westos字符串
/bash$/:条件
/条件1|条件2/:条件1或者条件2
/条件1/||/条件2/:条件1或者条件2
/条件1/&&/条件2/:条件1并且条件2
$0:所有的列
$1:第一列
$2:第二列
$3:第三列
awk -F : ‘$6!~/home/&&/bash$/{print $0}’ /etc/passwd :在/etc/passwd中查看第六列没有home关键字并且以bash结尾输出整行