2、shell入门命令练习及文本处理三剑客


前言

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值