Linux自动化运维工程师--(2)文本处理工具

本文介绍了Linux自动化运维工程师如何运用grep、sed和awk命令进行文本处理,包括正则表达式搜索、行数处理、字符替换、文件操作及条件判断。通过实例演示了如何查找特定关键字、替换内容、过滤行以及进行基本的数据分析。
摘要由CSDN通过智能技术生成

Linux自动化运维工程师

实验所用系统为Redhat-rhel8.2。


实验环境:
一台配置好网络软件仓库和IP的虚拟机

Linux自动化运维工程师–文本处理工具

一、grep命令

1、grep简介

grep [Globally search a Regular Expression and Print]命令用于查找文件里符合条件的字符串。全局搜索正则表达式,搜索模式为贪婪模式,只要包含关键字就会被搜索出来
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

grep				##只支持基础的正则表达式
grep -E = egrep		##支持基础和扩展的正则表达式

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

实验步骤:
切入到/mnt,复制/etc/passwd到当前文件夹,并截取部分内容以便做实验。
搜索含有root关键字的行。
请添加图片描述
搜索含有root和nologin关键字的行。
请添加图片描述
向passwd文件中加入一行,内容为ROOT。忽略大小写搜索含有root的行。
请添加图片描述
搜索符合条件root前后不能有字符的行。搜索含有halt字符的行并显示行号。
请添加图片描述
搜索过滤行以及上面几行和下面几行。
请添加图片描述
反向过滤,搜索不含root的行。
请添加图片描述

3、grep字符数量匹配规则

^westos				##以westos开有
westos$				##以westos结尾
w....s				##w开头s结尾中间4个任意字符
.....s				##s结尾前面5个任意字符
*					##字符出现任意
?					##0到1次
+					##1次到任意次,至少1次
{n}					##n次
{m,n}				##m到n次
{0,n}				##0-n次
{,n}				##0-n次
{m,}				##最少m次
(lee){2}			##lee字符串出现2次

实验步骤:
搜索以root开头的行,搜索以root结尾的行。
请添加图片描述
编辑westos文件作为实验素材。
请添加图片描述

请添加图片描述
请添加图片描述

  • 练习:请显示系统中能被su命令切换的用户名称(/bash /sh)
    在/etc/passwd文件里搜索以bash或者sh结尾的用户,并以:隔开截取第一列。
    请添加图片描述
    请添加图片描述

二、sed命令

1、sed简介

Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

2、sed命令格式

sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
-e	##表示多条策略的执行
1)对字符的处理
  1. p--显示
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		##显示以#开头的行	

实验:
打印第五行内容。
请添加图片描述
打印第三行到第五行的内容。
请添加图片描述
打印第三行和第五行的内容。,不输出模式空间内的内容,只输出被处理过的内容。
请添加图片描述
打印指定内容的行。
请添加图片描述

  1. d--删除
d							##删除
sed 5d	westos				##删除第五行
sed '/^#/d'	fstab			##把#开头的行删除
sed '/^UUID/!d' fstab		##除了UUID以外的行都删除
sed -e '5,$d' westos		##删除第五行到最后一行

实验:
删除第五行。
请添加图片描述
删除5-8行;删除第5行和第8行。
请添加图片描述
删除指定内容的行。
请添加图片描述

  1. a--添加
a									##添加
sed -e '$a hello world' fstab		##添加一行内容,默认为最后一行
sed -e '$a hello\nworld' fstab		##添加hello,换行添加world,\n表示换行
sed -e '/^#/a hello world' fstab	##在以#开头的行后添加内容

实验:
在指定位置添加内容。
请添加图片描述

  1. c--替换
sed -e '/^#/c hello world' fstab	##将以#开头的行替换为指定内容
sed '5chello world' westos			##将第五行替换为指定内容

实验:
请添加图片描述

  1. w--把符合的行写到指定文件中
sed '/^UUID/w westofile' westos		##把westos中UUID开头的行写入westosfile中

实验:
请添加图片描述

  1. i--插入(默认在指定内容上一行)
sed '5ihello westos' westos		##在第五行插入指定内容

实验:
-i参数默认添加在指定行上一行,-a参数默认添加在指定行下一行。
请添加图片描述

  1. r--整合文件(默认在在指定行下一行)
sed '5r haha' westos		##将haha文件中的内容整合到westos文件的第五行后

实验:
请添加图片描述请添加图片描述

2)sed字符替换
s--所有的行
g--所有的列,如果不加,默认为每行出现的第一列
sed 's/:/###/g' passwd 						##将所有的:替换成###
sed 's/:/###/' passwd 						##将所有第一列的:替换成###			
sed '1,5s/:/###/g' passwd 					##第1行到第5行(使用;隔开)
sed -e '1s/:/###/g' -e '5s/:/###/g' passwd	##第1行和第5行(用两个-e连接两个替换策略)
sed '1s/:/###/g' passwd 					##第1行
sed '1s/:/###/g;5s/:/###/g' passwd 			##第1行和第5行
sed '/lp/,/shutdown/s/:/###/g' passwd  	 	##lp开头,shutdown结尾
sed 's/\//####/g' passwd 					##所有的/替换成###
sed 's@/@####@g' passwd 					##所有的/替换成###
sed '=' passwd								##=表示给文件中的每一行前加行号,默认加在每一行的前一行
sed '=' passwd | sed 'N;s/\n/ /g'			##将行号加在每一行前,通过管道将行号后的换行符\n替换为空格(N表示提前加载sed处理行的下一行)
sed '=' passwd | sed 'N;s/\n/ /g' > westos 	##重定向生成文件
sed 'G' passwd								##G表示给westos文件的每一行后添加空行
sed '$!G' passwd 							##除最后一行外给westos文件的每一行后添加空行

实验:
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

[注意] 使用sed命令将passwd文件中第1行和第5行每一列中的:替换为###,有两种方式:一种是在一个替换策略里将两个条件用;隔开,另一种是使用两个-e参数连接两个替换策略。

请添加图片描述
请添加图片描述

[注意] “\”为转义符,表示其后所跟的“/”是有意义的。

请添加图片描述
请添加图片描述
请添加图片描述请添加图片描述
请添加图片描述
或者编写一个规则文件,将passwd文件中的nologin替换成westos。

请添加图片描述

  • 练习:编写一个脚本Apache_port.sh,此脚本后接数字,即设定http端口改为此数字,假设selinux为关闭状态。
    例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!

sh Apache_port.sh 8080
apache的端口会被修改为8080
  • 思路解析:
    首先设定selinux状态,其次检测脚本执行时是否输入数字,没有则退出,然后检测http服务是否安装,没有则安装,安装需检测网络软件仓库是否完备,没有则报错退出,已安装则检测服务是否开启,没有则开启,已开启则检测输入的数字端口是否被占用,没有被占用则修改,被占用则报错退出,修改完成后重启服务,并输出端口检测。
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述

三、awk

1、awk简介

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。Awk是为高级文本处理而设计的通用脚本语言。主要用作报告和分析工具。
awk处理过程: 依次对每一行进行处理,然后输出。

2、awk命令格式

awk -F 分隔符 BEGIN{}{}END{} FILENAME

用法:

awk -F : '{print $1}' passwd		##显示第一列
awk -F : '{print $1,$2}' passwd 	##显示第一列和第二列,“,”表示分隔符为空格
awk -F : '{print $1":"$2}' passwd 	##显示第一列和第二列,“:”为分隔符,需转义
awk -F : 'BEGIN{print "name"}{print $1}END{print "end"}' passwd		
##显示第一列,以name开头,end结束
##BEGIN表示运行处理策略前做的动作;"name"字符串不加引号表示变量,加引号表示字符串本身;
##{print $1}表示需要处理的动作;END表示处理结束动作之后要做的事情

请添加图片描述
请添加图片描述
请添加图片描述

3、变量

NR			#行数
NF 			#列数
FILENAME	#文件名称本身
westos		#westos变量值
“westos” 	#westos字符串

实验:

awk -F : '{print NR}' passwd 						##显示所处理文件的行数
awk -F : '{print NF}' passwd						##显示所处理文件的每一行的列数
awk -F : '{print FILENAME}' passwd 					##显示所处理的文件名称
awk -F : 'BEGIN{westos=1}{print westos}' passwd 	##显示westos(变量)的值,此时passwd文件的作用是提供所要显示的行数
awk -F : 'BEGIN{westos=1}{print "westos"}' passwd 	##显示westos(字符串)本身
awk -F : 'BEGIN{westos=1}{westos++}END{print westos}' passwd	##每处理一行westos加一,处理所有行之后打印westos的值

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

4、条件

/bash$/				##条件
/条件1|条件2/		##条件1或者条件2(一个条件中两个元素)
/条件1/||/条件2/		##条件1或者条件2(两个条件)
/条件1/&&/条件2/		##条件1并且条件2

[注意] 没有一个条件中两个元素的并且关系,只有两个条件的并且关系

实验:

awk -F : '/nologin$/{print $1,$7}' passwd 	
##显示以nologin结尾的行的第一列和第七列
awk -F : '/nologin$|^root/{print $1,$7}' passwd 
##显示以nologin结尾或者以root开头的行的第一列和第七列(一个条件中两个元素为或者关系)
awk -F : '/nologin$/||/^root/{print $1,$7}' passwd 	
##显示以nologin结尾或者以root开头的行的第一列和第七列(两个条件为或者关系)
awk -F : '/bash$/&&/^root/{print $1,$7}' passwd		
##显示以bash结尾以root开头的行的第一列和第七列(两个条件的并且关系)

请添加图片描述
请添加图片描述请添加图片描述

$0			#所有的列
$1			#第一列
$2			#第二列
$3			#第三列

实验:

awk -F : '{print $0}' passwd 		##显示passwd文件的所有列
awk -F : '{print $1}' passwd		##显示passwd文件的第一列

请添加图片描述

awk -F : '$7~/bash$/{print $0}' passwd 		##passwd文件中第七列是bash结尾的行
awk -F : '$7!~/bash$/{print $0}' passwd		##passwd文件中第七列不是bash结尾的行

请添加图片描述

  • 练习:统计在系统中能su切换的并且用户家目录不在/home下的用户数量
  • 思路解析:能被su切换的用户默认shell为/bin/bash或者/sh,其次家目录为/home,则在/etc/passwd里搜索以/bash或者/sh结尾并且不以/home开头的用户,使用变量自加的方式统计数量。
    请添加图片描述

[注意] /home中的“/”需要转义,因为“/”指的是根目录。

  • 练习:使用awk的一条命令抓取ens3网卡的ip
  • 思路解析:先使用ifconfig ens3命令观察输出。ip在inet后,即inet为第一列,ip为第二列,抓取inet,其前后都没有字符,输出第二列。
ifconfig ens3 | awk '/\<inet\>/{print $2}'

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值