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)对字符的处理
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 ##显示以#开头的行
实验:
打印第五行内容。
打印第三行到第五行的内容。
打印第三行和第五行的内容。,不输出模式空间内的内容,只输出被处理过的内容。
打印指定内容的行。
d--删除
d ##删除
sed 5d westos ##删除第五行
sed '/^#/d' fstab ##把#开头的行删除
sed '/^UUID/!d' fstab ##除了UUID以外的行都删除
sed -e '5,$d' westos ##删除第五行到最后一行
实验:
删除第五行。
删除5-8行;删除第5行和第8行。
删除指定内容的行。
a--添加
a ##添加
sed -e '$a hello world' fstab ##添加一行内容,默认为最后一行
sed -e '$a hello\nworld' fstab ##添加hello,换行添加world,\n表示换行
sed -e '/^#/a hello world' fstab ##在以#开头的行后添加内容
实验:
在指定位置添加内容。
c--替换
sed -e '/^#/c hello world' fstab ##将以#开头的行替换为指定内容
sed '5chello world' westos ##将第五行替换为指定内容
实验:
w--把符合的行写到指定文件中
sed '/^UUID/w westofile' westos ##把westos中UUID开头的行写入westosfile中
实验:
i--插入
(默认在指定内容上一行)
sed '5ihello westos' westos ##在第五行插入指定内容
实验:
-i
参数默认添加在指定行上一行,-a
参数默认添加在指定行下一行。
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}'