Linux文本处理三剑客grepsedawk用法详解

Posted 是大姚呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文本处理三剑客grepsedawk用法详解相关的知识,希望对你有一定的参考价值。

Linux文本处理工具grep、sed、awk用法详解

1、grep

1)grep简介

grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。

2)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 					##反向过滤

实验步骤:
1)切换到一个空目录/mnt中,cp /etc/passwd .复制/etc/passwd文件到该目录(. 表示当前目录)中,避免文件内容过长删除一部分内容,使用grep命令在截取以某个字符串结尾的数据时,如果需要判断的结尾字符串有多个,需要用 | 连接多个正则表达式,但执行命令后抓取数据失败,这是因为 | 是扩展表达式,我们需要使用egrep命令才能用 | 连接多个判断字符串进行数据抓取,为了便于记忆,我们可以使用统一命令grep -E
在这里插入图片描述
在这里插入图片描述
2)编辑/mnt/passwd文件,在其中加入几行数据用来进行命令测试
在这里插入图片描述
3)使用grep命令过滤passwd文件中root关键字所在的行、使用-i 参数忽略大小写过滤passwd文件中root关键字所在的行,可以看到过滤结果中多了一条含有ROOT字符串的行
在这里插入图片描述
4)使用grep -E命令过滤passwd文件中root字符前没有字符的行、root字符后没有字符的行
注意: grep使用"<“或”>"只能抓取匹配字符串之前或之后不能有字符串的数据,像/root也会被查找出来,这是因为/为单个字符,而不是字符串
在这里插入图片描述
5)使用grep命令过滤passwd文件中ROOT关键字所在行及其上、下5行;使用grep命令过滤passwd文件中ROOT关键字所在行并显示行号;使用grep命令过滤显示passwd文件中ROOT关键字所在行及下面3行;使用grep命令过滤显示passwd文件中ROOT关键字所在行及上面3行
在这里插入图片描述
6)使用-v参数反向过滤passwd文件中不含有root关键字的行
在这里插入图片描述
7)命令练习:过滤passwd文件中行首、行尾不以root开头、结尾,行中有root关键字的行并显示
在这里插入图片描述

3)grep命令字符数量匹配规则

正则表达式含义
^westos以westos关键字开头
westos$以westos结尾
w…sw开头s结尾中间含有3个任意字符
…ss结尾前面有3个任意字符
*字符出现次数任意(即0次到任意次
?字符出现0到1次
+字符出现1次到任意次
{n}字符出现n次
{m,n}字符出现m到n次
{,n}字符出现0到n次
{m,}字符最少出现m次

实验步骤:
1)切换到一个空目录/mnt中,新建并编辑文件westos如下
在这里插入图片描述
2)使用grep命令分别过滤westos文件中,以w开头s结尾中间含有1 / 2 / 3 / 任意个任意字符的关键字所在的行( * 表示任意字符 . 的个数任意)
在这里插入图片描述
3)使用grep -E命令过滤westos文件中,以w开头s结尾中间含有4个 / 含有3个 / 最少含有3个 / 含有1到3个任意字符的关键字所在的行
在这里插入图片描述
4)使用grep -E命令过滤westos文件中,以w开头s结尾中间含有0到1个 / 含有1到任意个任意字符的关键字所在的行
在这里插入图片描述
5)使用grep -E命令过滤westos文件中,以w开头s结尾中间最多含有3个任意字符 / 字符e / 字符串eb的关键字所在的行
注意: 关键字的中间匹配项为字符串时,必须给字符串外加上(),这样grep命令执行时才会将其作为一个整体来处理
在这里插入图片描述
6)命令练习:编写脚本显示系统中能被su命令切换的用户名称
思路:/etc/passwd文件中以bash、sh结尾的行所对应的用户就是系统中能被su命令切换的用户(即有交互的shell),我们可以使用grep -E命令过滤显示/etc/passwd文件中以bash、sh结尾的行后,通过管道使用cut命令以:为分隔符截取第一列(用户名称所在列)
在这里插入图片描述
在这里插入图片描述

2、sed

1)sed简介

sed 全名叫 stream editor即流编辑器,与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。

2)sed命令格式

a)p :显示

sed 参数 命令 处理对象
sed -n 5p westos 		##显示第5行
sed -n 3,5p westos 		##显示第3行到第5行
sed -n "3p;5p" westos 	##显示第3行和第5行
sed -n 1,5p westos 	##显示1-5行
sed -n '5,$p' westos 	##显示第5行到最后一行
sed -n '/^#/p' fstab 	##显示以#开头的行

b)d :删除

sed 5d westos 			##删除第5行
sed '/^#/d' fstab 		##把以#开头的行删除
sed '/^UUID/!d' fstab 	##删除不是以UUID开头的所有行
sed  '5,$d' westos		##删除第5行到最后一行

c)a :添加

sed '$a hello world' fstab		##在最后一行后添加字符串
sed '$a hello\\nworld' fstab		##在最后一行后添加字符串,使用换行符隔开
sed '/^#/a hello world' fstab	##在以#开头的行后添加字符串

d)c :替换

sed '/^#/c hello world' fstab	##将所有以#开头的行替换为指定字符串
sed '5chello world' westos		##将第5行替换为指定字符串

e)w :把符合的行写入到指定文件中
sed '/^UUID/w westofile' westos :把westos中UUID开头的行写入westosfile中
f)i :插入
sed '5ihello westos' westos:在westos文件的第5行前插入指定字符串
g)r :整合文件
sed '5r westofile' westos:将westofile文件中的内容整合到westos文件的第5行后

实验步骤:
1)切换到一个空目录/mnt中,复制/etc/passwd文件到该目录(.表示当前目录)中,避免文件内容过长删除一部分内容,再cat -b westos将文件内容带行号显示并将显示结果导入到/mnt下的另一新建文件westos中(加行号是为了便于后续观察命令的执行效果)
在这里插入图片描述
2)我们可以使用head命令 / tail命令查看文件的前几行 / 后几行,但无法查看指定行 ,使用sed命令可以解决这一问题,如下图所示:使用sed -n命令查看显示westos文件的第5行 / 第3行到第5行 / 最后一行 / 含有root关键词的行 / 第3行和第4行
注意: sed 5p 不加-n参数时不仅显示文件的指定行,还会显示其他所有的行,-n参数只显示文件的指定行
在这里插入图片描述
3)使用sed命令删除westos文件的第5行 / 第5行和最后一行 / 第5行到最后一行 / 含有root关键词的行 / 不含有root关键词的行
注意: 使用d参数进行删除时不需要加-n,因为指定行已删除,所以无输出显示
在这里插入图片描述
在这里插入图片描述
4)使用sed命令在第1行 / 最后一行后添加内容,这里可以使用换行符隔开添加内容中的字符串
在这里插入图片描述
5)使用a参数进行添加时默认添加在指定行之后,我们可以使用i参数将字符串插入到指定行之前
在这里插入图片描述
6)使用c参数将westos文件的第1行 / 含有root关键词的行替换为指定字符串
在这里插入图片描述
7)使用w参数将westos文件中含有root关键词的行写入文件file中,相当于在显示含有root关键词的行后进行了输出重定向操作
在这里插入图片描述
8)使用r参数将file文件中的内容整合到westos文件的第5行后,但此时查看westos文件内容无变化,这是因为整合文件时需要加入-i参数才把sed处理的内容保存到westos文件中
在这里插入图片描述
在这里插入图片描述

3)sed字符替换

实验步骤:
1)切换到一个空目录/mnt中,复制/etc/passwd文件到该目录中,避免文件内容过长删除一部分内容,文件中的内容是以:分隔的,我们可以使用vim编辑passwd文件进行字符替换,也可以使用sed进行字符替换,字符替换时要用 ‘ ’ 将替换策略引起来
在这里插入图片描述
使用sed命令将passwd文件中每一行每一列中的:替换为###
在这里插入图片描述
2)=表示给文件中的每一行前加行号,但是默认加在每一行的前一行,如果想要将行号加在每一行前,我们需要通过管道将行号后的换行符\\n替换为空(N表示提前加载sed处理行的下一行)在这里插入图片描述
在这里插入图片描述
3)给passwd文件中每一行前添加行号后将显示结果输出重定向生成另一文件westos,G表示给westos文件的每一行后添加空行,$!G表示除最后一行外给westos文件的每一行后添加空行
在这里插入图片描述
在这里插入图片描述
4)使用sed命令将westos文件中第1行到第5行每一列中的:替换为###
在这里插入图片描述
使用sed命令将westos文件中sync关键字所在行到halt关键字所在行每一列中的:替换为###
在这里插入图片描述
5)使用sed命令将westos文件中第1行和第4行每一列中的:替换为###,有以下两种方式:
方法一: 在一个替换策略中写两个表达式用;隔开
在这里插入图片描述
方法二: 用两个-e连接两个替换策略
在这里插入图片描述
6)使用sed命令将westos文件中每一行每一列中的特殊字符/(表达式中需要用/隔开)替换为###,有以下两种方式:
方法一: 在 / 前加 \\ 转译特殊字符
在这里插入图片描述
方法二: 使用 @ 符替换表达式中用来隔开的 / 符
在这里插入图片描述
7)命令练习:假设selinux为关闭状态,编写脚本Apache_port.sh修改http端口号
思路:首先对执行脚本时脚本后用户输入的字符串进行是否为空的判断,如果为空则退出运行并提示用户输入端口号,如果不为空则对用户输入的端口号使用lsof -i:命令检测该端口是否被占用,如果被占用则退出运行并报错,如果未被占用则使用sed命令将httpd服务主配置文件/etc/httpd/conf/httpd.conf中的端口设定语句替换为用户输入端口号对应的端口设定语句,接着重启httpd服务
在这里插入图片描述
在这里插入图片描述

3、awk

1)awk简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

2)awk命令格式

awk -F 分隔符 BEGIN{}{}END{} FILENAME:这里FILENAME指的是文件名称本身

表达式				#含义
westos 				#westos变量值
“westos” 			#westos字符串

/条件1|条件2/ 		#条件1或者条件2 
/条件1/||/条件2/ 	#条件1或者条件2 
/条件1/&&/条件2/ 	#条件1且条件2 
$0 					#所有的列
$1 					#第一列
$2					#第二列
$3 					#第三列

实验步骤:
1)使用awk命令,首先输出显示westos,接着-F指定以:为分隔符截取显示passwd文件的第一列,最后输出显示end
注意: ‘ ’引起来的截取策略中的字符串需要用“ ”引起来,否则awk命令会将其当作变量处理(即不会输出显示指定字符串本身)
在这里插入图片描述
在这里插入图片描述
2)使用awk命令统计passwd文件行数:给变量N赋初值为0,awk每读取一行文件内容变量N就进行一次自加操作,最后输出变量N的值即为passwd文件的行数
在这里插入图片描述
3)使用awk命令-F指定以:为分隔符截取显示passwd文件的第一列
在这里插入图片描述
使用awk命令以:为分隔符截取显示passwd文件中以bash结尾的行的第一列;使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且含有root关键字的行的第一列;使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且不含有root关键字(!表示不含有)的行的第一列;使用awk命令以:为分隔符截取显示passwd文件中以bash结尾或含有root关键字的行的第一列
注意: |表示或时是一个截取条件中的两个元素,||表示或时是两个截取条件中各自的一个元素
在这里插入图片描述
4)使用awk命令以:为分隔符截取第七列以bash结尾的行的第一列($7~表示指定第七列);使用awk命令以:为分隔符截取第七列不以bash结尾的行的第一列
在这里插入图片描述
使用awk命令以:为分隔符截取第七列不以bash结尾的行的全部列($0 表示所有的列)
在这里插入图片描述
5)命令练习:统计在系统中能su切换的且用户家目录不在/home下的用户数量
思路:使用awk命令以:为分隔符截取/etc/passwd文件中第六列不以/home开头的(/需要转译;不能直接写不含有home关键字,存在类似用户家目录为/tmp/home这种情况)、并且以bash或sh结尾的行,对截取结果进行计数,这里我们可以创建用户对脚本进行测试
在这里插入图片描述
6)命令练习:统计系统内存使用总量
思路:使用ps ax -o %mem可以查看所有进程占用内存量,将查看结果通过管道,使用awk命令去掉字符串或内存占用为0.0所在的行后将所有值($1表示读取每一行的第一个字符串)循环+=,得到所有进程占用内存总量(字符串不去掉不影响计算结果,但会降低脚本执行效率)
在这里插入图片描述
在这里插入图片描述

以上是关于Linux文本处理三剑客grepsedawk用法详解的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本三剑客超详细教程---grepsedawk

gawk 文本处理入门用法详集

linux三剑客(grepsedawk)

Linux文本处理三剑客(grep,sed,awk)

提升工作效率1000%之Linux三剑客(grepsedawk)

提升工作效率1000%之Linux三剑客(grepsedawk)