文章目录
前言
shell 尽量在虚拟机中练习,防止自动脚本毁坏物理机
这里用server2练习shell相关
一、命令练习
1.1 diff命令
用法
- diff [options] files|directorys files|irectory
输出信息:
[num1,num2][a|c|d][num3,num4]
num1,num2 #第一个文件中的行
- a ##添加
- c ##更改
- d ##删除
- < ##第一个文件中的内容
- > ##第二个文件中的内容
- num3,num4 ##第二个文件中的行
- 常用参数:
- -b ##忽略空格
- -B ##忽略空行
- -i ##忽略大小写
- -c ##显示文件所有内容并标示不同
- -r ##对比目录
- -u ##合并输出
实验
1.2 patch工具
用法
dnf install patch -y ##安装patch 软件
patch 原文件 布丁文件
-b ##备份原文件 ,生成原文件备份文件后缀为orig
实验
1)生成补丁文件
2)配置好yum仓库
3)测试patch工具
1.3 cut命令
用法
-d : ##指定:为分隔符
-f ##指定显示的列 5第五列| 3,5 3和5列|3-5 3到5列|5- 第五列以后|-5 到第五列
-c ##指定截取的字符(数字用法同-f)
实验
1)准备一个测试文件
2)分割文件的第1列;第1-3列…
3)截取字符
1.4 sort命令
用法
-n ##纯数字排序
-r ##倒叙
-u ##去掉重复
-o ##输出到指定文件
-t ##指定分隔符
-k ##指定排序的列
实验
1)准备一个乱序文档
2)测试参数
1.5 uniq命令
用法
-c #合并重复并统计重复个数
-d #显示重复的行
-u #显示唯一的行
实验
1.6 测试题
- 1.ifconfig 网卡 可以显示此网卡的信息
显示信息中包含此网卡使用的ip地址
请用命令过滤此ip并在输出时只显示ip其他信息不显示 - 2.找出能登陆系统用户中UID最大的用户,并显示其名称(可以先不看)
- 3.当前主机为web服务器,请抓取访问web服务器次数排在前5的ip地址
答案:
1.7 tr命令
用法
tr 'a-z' 'A-Z' ##小写转大写
tr 'A-Z' 'a-z' ##大写转小写
实验
1.8 test命令
用法1
test = [] ##[] 就相当于test命令
- "test $a = $b" = [ "$a" = "$b" ]
- [ ! "$a" = "$b"] 除了$a=$b
test数字对比
- =
- !=
- -eq ##等于
- -ne ##不等于
- -le ##小于等于
- -lt ##小于
- -ge ##大于等于
- -gt ##大于
test的条件关系
- -a ##并且
- -o ##或者
test对空的判定
- -n ##nozero 判定内容不为空
- -z ##zero 判定内容为空
&&和||
- && 符合条件作动作
- || 不符合条件作动作
实验1
-gt 大于
-lt 小于
测试题1
- 执行下列脚本来判断用户类型
- user_check.sh 用户
- 用户类型为
- super user
- system user
- common user
用法2
test对于文件的判定
-ef ##文件节点号是否一致(硬链)
-nt ##文件1是不是比文件2新
-ot ##文件1是不是比文件2老
-d ##目录
-S ##套结字
-L ##软连接
-e ##存在
-f ##普通文件
-b ##快设备 -c ##字符设备
实验2
测试题2
- 编写脚本完成以下条件
- file_check.sh 在执行时
- 如果脚本后未指定检测文件报错“未指定检测文件,请指定”
- 如果脚本后指定文件不存在报错“此文件不存在”
- 当文件存在时请检测文件类型并显示到输出中
二、文本处理工具三剑客
2.1 grep
用法
grep 格式
- grep 匹配条件 处理文件
- grep -E = egrep ##E是扩展的意思可以相当于或
- grep -E 'halt|lp' file ##查找halt或者lp存在的行
- 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 -数字 passwd /etc/passwd ##显示过滤行以及上面几行和下面几行
- grep -n2 passwd /etc/passwd ##和上面一个意思
- grep -n passwd /etc/passwd ##显示匹配的行所在行号
- grep -A passwd /etc/passwd ##显示过滤行以及下面几行
- grep -B passwd /etc/passwd ##显示过滤行以及上面几行
- grep -v passwd /etc/passwd ##反向过滤
grep 字符数量匹配规则
- ^westos ##以westos开有
- westos$ ##以westos结尾
- w....s ##w开头s结尾中间4个任意字符
- .....s ##s结尾前面5个任意字符
- * ##字符出现0-任意
- ? ##0到1次
- + ##1次到任意次
- grep -E "we+s" 文件名
- {n} ##n次
- {m,n} ##m到n次
- {0,n} ##0-n次
- {,n} ##0-n次
- {m,} ##最少m次
- (lee){2} ##lee字符串出现2次
实验
1)grep 格式
2)grep 字符数量匹配规则
练习
- 请显示系统中能被su命令切换的用户名称
- grep -E “bash$ | sh$” /etc/passwd | cut -d : -f 1
2.2 sed
首先在内存上开辟一块模式空间,将操作文件拷贝一份在内存上,所以命令不对硬盘内数据读写,只读写内存上的,若读写硬盘内文件数据需要加参数(-i)
用法
- 命令格式:
- sed 参数 命令 处理对象
- sed 参数 处理对象 -f 处理规则文件(自己写,里面是命令)
-
- 对字符的处理
- p ##显示
- sed -n 5p westos ##显示第五行,n表示静默输出,不显示模式空间内容
##没有 -n参数会显示两遍,一遍是模式空间的(内存上),一遍是硬盘里的
- sed -n 3,5p westos ##显示3到5行
- sed -ne "3p;5p" westos ##显示3和5行,几个e几个策略,加双引号可以简略用一个e
- sed -n 1,5p westos ##1-5行
- sed -n '5,$p' westos ##5到最后一行
- sed -n '/^#/p' fstab ##显示以#开头的行
- d ##删除
- sed 5d westos ##删除第五行
- sed '/^#/d' fstab ##把#开头的行删除
- sed '/^UUID/!d' fstab ##除了UUID以外的行都删除
- sed -e '5,$d' westos ##删除5到最后一行(不加e也可以)
- a ##添加
- sed -e '$a hello world' fstab ##最后一行添加,$表示最后一行,e表示多条命令(此处不加e也可)
- sed -e '/^#/a hello world' fstab ##以#开头的行后加hello world
- sed '/nologin/a hello world' file ##nologin的行后面加hello world
- c ##替换
- sed -e '/^#/c hello world' fstab ##以#开头的替换成hello world
- sed '5c hello world' westos ##第五行替换成hello world
- w ##把符合的行写到指定文件中
- sed '/^UUID/w westofile' westos ##把westos中UUID开头的行写入westosfile中
- sed '/nologin/w file1' file ##把file中不能登陆的行写入file1
- i ##插入
- sed '5i hello westos' westos ##第5行插入hello westos
- sed '/nologin/i ok' file ##nologin 所在行写入ok
-
- r ##整合文件
- vim hello
- sed '5r hello' westos ##把hello文件内容放到westos文件的第5行之后,此处hello是一个文件
- sed字符替换
- sed 's/:/###/g' westos ##将westos文件中:替换成###
- sed '1,5s/:/###/g' westos ##1到5行的:替换成###
- sed '1s/:/###/g;5s/:/###/g' westos ##1到5行的:替换成###
- sed '/lp/,/shutdown/s/:/###/g' westos ##lp和shutdown之间的:替换成###
- sed 's/\//####/g' westos ##把/替换成#### \/转义
- sed 's@/@####@g' westos ##@和/是一个意思,都表示分割符
- sed -e 's/:/###/g' -e 's@/@####@g' westos ##-e处理多条语句
- sed 's@/@####@g' -i westos ##把sed处理的内容保存到westos文件中(修改的是westos文件内容,修改后覆盖原来内容)
实验
1)复制个文件做实验
2)测试
练习
Apache_port.sh
- 此脚本后加入数字
- http的端口就改为此数字
- 假设selinux为关闭状态
2.3 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 #第三列
- $1,3 #第一列和数字3
- $1"###"$3 #第一列和第三列以###分隔开
- awk -F : 'BEGIN{westos=1}{print westos}' file ##先设定westos变量指,然后显示westos变量
- awk -F : 'BEGIN{westos=1}{print westos}END{print "end"}' file ##以end结束,要用双引号
- awk -F : '/bash$/{print $1}' file ##输出以bash结尾的第一列
- awk -F : '/bash$/||/^root/{print $1}' file ##输出以bash结尾或者以root开头的第一列
- awk -F : '/bash$/&&/root/{print $1}' file ##以bash结尾,且包含root的第一列
- awk -F : '!/bash$/&&/root/{print $1}' file ##不以bash结尾,且包含root的第一列。!需要放在//前
- awk -F : '/bash$|root/{print $1}' file ##以bash结尾或者包含root的第一行
- #/etc/passwd文件的第六列没有home关键字并且以bash结尾的行
- awk -F : '$6!~/home/&&/bash$/{print $1}' /etc/passwd
实验
练习
- 统计在系统中能su切换的并且用户家目录不在/home下的用户数量
- awk -F : ‘BEGIN{n=0}KaTeX parse error: Expected 'EOF', got '&' at position 10: 6!~/home/&̲&/bash/{n++}END{print n}’ /etc/passwd