初识shell——shell中的文本处理工具***

1.grep

grep命令简介

grep (缩写来自Globally search a Regular Expression and Print)——全局搜索正则表达式,是一种强大的文本搜索工具,它能使用特定模式匹配搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep和fgrep都是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

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 				#反向过滤,显示除了匹配行之外的其他行

grep字符数量匹配规则
^westos 	#以westos开头
westos$ 	#以westos结尾
w....s 		#以w开头s结尾,中间有4个任意字符
.....s 		#以s结尾,前面5个任意字符
* 			#字符出现0到人一次
? 			#0到1次
+ 			#1到任意次
{n} 		#n次
{m,n} 		#m到n次
{0,n} 		#0-n次
{,n} 		#0-n次
{m,} 		#最少m次
(lee){2} 	#lee字符串出现2次:grep -E "w(lee){2}s" test
练习脚本:
请显示系统中能被su命令切换的用户名称
参考答案:
#!/bin/bash
grep -E "bash$|sh$|tcsh$|csh$" /etc/passwd | cut -d : -f 1 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
grep字符数量匹配规则示例:
在这里插入图片描述
练习:
在这里插入图片描述

2.sed

SED(Stream EDitor)是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大。
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
在这里插入图片描述

对字符的处理 
-p 		#显示(p:print)
sed -n 5p westos 		#显示westos文件第五行,n:不显示模式空间里的内容
sed -n 3,5p westos 		#显示3到5行
sed -ne "3p;5p" westos 	#显示3和5行,e:多条策略
sed -ne 1,5p westos 	#显示1-5行
sed -ne '5,$p' westos 	#第5行到最后一行
sed -n '/^#/p' fstab 	#显示以#开头的行
-d 		#删除
sed 5d westos 			#删除westos文件的第五行
sed '/^#/d' fstab 		#把fstab文件中以"#"开头的行删除
sed '/^UUID/!d' fstab 	#除了UUID以外的行都删除
sed -e '5,$d' westos    #删除第五行到最后一行
-a 		#添加
sed -e '$a hello world' fstab
sed -e '$a hello\nworld' fstab
sed -e '/^#/a hello world' fstab
-c 		#替换
sed -e '/^#/c hello world' fstab
sed '5chello world' fstab
-i 		#插入,放到匹配行的前面(和-a对应)
sed '5ihello westos' westos
-r 		#整合文件
sed '5r haha' westos

sed 字符替换
sed 's/:/###/g' westos					#将passwd文件的全文的:替换成### 
sed 's/:/###/' westos 
sed '1,5s/:/###/g' westos 				#替换第一行到第五行
sed '1s/:/###/g' westos 				#替换第一行
sed '1s/:/###/g;5s/:/###/g' westos 		#替换第一行和第五行
sed '/lp/,/shutdown/s/:/###/g' westos 	#替换lp到shutdown之间的
sed 's/\//####/g' westos 				#替换全文的/为####,其中\为转义字符
sed 's@/@####@g' westos 				#用@表示分隔符也行,和上个命令作用一样
sed 's@/@####@g' -i westos 				#把sed处理的内容保存到westos文件中,该命令用来修改原文件内容

练习及脚本
编写脚本Apache_port.sh
此脚本后写入数字
http的端口就改为此数字
(假设selinux为关闭状态)
参考如下:
#!/bin/bash
[ -z "$1" ] && {
	echo "please enter a number"
	exit			#判断脚本后是否输入数字
}
[ -z "`netstat -antlupe | grep  $1`" ] || {			#此处的``不是单引号,而是反向单引号,其内的优先执行
	echo "Error: $1 is used by system proto"
	exit			#判断输入的端口号是否被占用
}
[ -e "/etc/httpd/conf/httpd.conf" ] || {
	yum install httpd -y &> /dev/null || {
	echo apache not installed and yum repo is unavailable
	exit			#如果未安装apache服务,则自动安装,若安装过程中yum源未配置好则报错
	}
}
sed  "/^Listen/c Listen $1" -i /etc/httpd/conf/httpd.conf
					#修改apache服务的端口号
systemctl restart httpd > /dev/null && {
	echo " confiugre port successfully"
} || {				
	echo " Error: can't up service"
}					#重启apache服务,重启失败会报错

-p:显示
在这里插入图片描述
-d:删除
在这里插入图片描述
在这里插入图片描述
-a:添加
在这里插入图片描述
在这里插入图片描述
-c:替换
在这里插入图片描述
-i:插入
在这里插入图片描述
-r:整合文件
在这里插入图片描述
sed 字符替换
在这里插入图片描述
在这里插入图片描述
练习:
在这里插入图片描述
在这里插入图片描述
小插曲: $和反向单引号作用相同,里面的内容都是优先执行

在这里插入图片描述

3.awk

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

awk -F 分隔符 BEGIN{}{}END{} FILENAME
NR 			#行数
NF 			#列数
FILENAME 	#当前文件名称本身
westos 		#显示westos变量值
“westos” 	#显示westos字符串
/bash$/ 	#表示条件,以bash结尾的
/条件1|条件2/ 		#条件1或者条件2(一个条件,里面有两个元素)
/条件1/||/条件2/ 	#条件1或者条件2(两个条件)
/条件1/&&/条件2/ 	#条件1并且条件2 
$0			#所有的列
$1 			#第一列
$2 			#第二列
$3 			#第三列
awk -F : '$6!~/home/&&/bash$/{print}' /etc/passwd
#/etc/passwd文件的第六列没有home关键字并且以bash结尾的行
课后练习: 
统计在系统中能用su切换的并且用户家目录不在/home下的用户数量
#!/bin/bash
awk -F : 'BEGIN{N=0}$6!~/home/&&/bash$|sh$|tcsh$|csh$/{print $1;N++}END{print N}' /etc/passwd

用法示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
练习:
在这里插入图片描述

总结:awk、sed、grep更适合的方向:

grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理

结束!!!

猜你喜欢

转载自blog.csdn.net/weixin_46138661/article/details/105404687