脚本是由数据+逻辑组成的,其中数据的处理是很重要的,接下来学习各种对文本处理的方法。
1、diff找不同
diff 是用来对比两个文件的不同之处。首先创建两个素材如下,
输入diff testfile1 testfile2
,输出信息有【数字+字母+数字】,这里第一个数字表示第一个文件的第几行,第二个数字表示第二个文件的第几行,中间的字母有a
表示添加,c
表示更改,d
表示删除,还会输出<
表示第一个文件中的内容,>
表示第二个文件中的内容。清楚的看到两个文件的区别。具体的如下图,第一个文件的第四行和第二个文件的第四行更改了,第一个是word,第二个是werd。
常用参数:
(1)-b
忽略空格
(2)-B
忽略空行
(3)-i
忽略大小写
(4)-c
显示文件所有内容并标示不同
(5)-r
对比目录
(6)-u
合并输出,显示如何从第一个文件修改为第二个文件,即补丁文件
如下图,减就是去掉,加就是添加,就可以从第一个文件修改为第二个文件。
2、patch打补丁
patch的作用是打补丁,使用时要先dnf安装patch。
patch 原文件 补丁文件
,会把原文件根据补丁文件的提示修改为新文件,但是原文件会直接没了。
我们再次测试,patch -b 原文件 补丁文件
,会先备份原文件后缀为orig,再把原文件根据补丁文件的提示修改为新文件
3、cut抓取
(1)-d :
指定:为分隔符
(2)-f
指定显示的列 (5表示第五列| 3,5 表示3和5列|3-5 表示3到5列|5- 表示第五列以后|-5 表示第五列以前)
(3)-c
指定截取的字符(数字用法同-f)
练习1:ifconfig 网卡
可以显示此网卡的信息,显示信息中包含此网卡使用的ip地址,请用命令过滤此ip并在输出时只显示ip其他信息不显示
思路是以空格为分隔符,显示第十列,看前两行,再看最后一行。
4、sort排序
(1)-n
纯数字排序
(2)-r
倒叙
(3)-u
去掉重复
(4)-o
输出到指定文件
(5)-t
指定分隔符
(6)-k
指定排序的列
sort默认是按照首数字排序的,那么17比3小吗?显然不是,我们需要加-n
参数,纯数字排序
比如现在文件改为下图,现在加-n
参数也不管用,需要指定冒号为分隔符,排序第二列,纯数字排序,这样就可以了。
5、uniq 重复
(1)-c
合并重复并统计重复个数
(2)-d
显示重复的行
(3)-u
显示唯一的行
练习2:一个文件,很多行数字,找出出现次数最多的数字(如果并列怎么办)
思路是先纯数字排序,然后合并重复并统计重复个数,(默认第一列)把统计的重复个数按倒叙排列,以空格为分隔符抓取第八列,并显示第一行。
练习3:找出能登陆系统用户中UID最大的用户,并显示其名称grep bash$ /etc/passwd
思路是/etc/passwd文件中bash结尾的就是能登陆系统的,然后以冒号为分隔符第三列(UID)排倒序,抓取第一列,显示第一行。
6、tr
单个字符转换
tr 'a-z' 'A-Z'
小写转大写
tr 'A-Z' 'a-z'
大写转小写
7、&& 和||
&&
符合条件作动作
||
不符合条件作动作
练习4:ping ip
可以通显示up,不通显示down
思路是ping 的次数是1,等待1秒,输出导入垃圾桶,如果成功显示绿色的up,如果失败显示红色的down。$1代表后面跟的第一串数字。
效果是
8、test 比较
test
命令和 [ ]
命令都是用来判断比较的。
常用参数如下:
(1)=
等于
(2)!=
不等于
(3)-eq
等于
(4)-ne
不等于
(5)-le
小于等于
(6)-lt
小于
(7)-ge
大于等于
(8)-gt
大于
(9)-a
并且
(10)-o
或者
(11)-n
判定内容不为空(nozero)
(12)-z
判定内容为空(zero)
(13)unset a
清空a的值
test对于文件的判定
(1)-ef
文件节点号是否一致(硬链)
(2)-nt
文件1是不是比文件2新
(3)-ot
文件1是不是比文件2老
(4)-d
目录
(5)-S
套结字
(6)-L
软连接
(7)-e
存在
(8)-f
普通文件
(9)-b
块设备
(10)-c
字符设备
练习5:编写脚本完成以下条件,file_check.sh 在执行时,如果脚本后未指定检测文件报错“未指定检测文件,请指定”
如果脚本后指定文件不存在报错“此文件不存在”,当文件存在时请检测文件类型并显示到输出中。
效果如下,