Shell常用命令
1、diff
diff命令用于对比两个文件的不同。
demo:
可以使用vimdiff进行比较:
对于实验所用文件,直接使用命令vimdiff xxx.conf xxx.conf.new
来对比两者的不同:
可以看到,两文件在使用vimdiff进行对比时,两文件的不同之处会高亮显示,可用于日常排错。
vimdiff在使用时,不仅可以对比两个文件,也可以对比多个文件,方法相同:
直接使用diff命令进行比较
diff描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配。
demo:
还是上面的实验素材,这次我们直接使用diff进行比较:
可以看到,使用diff命令后,出现
3a4
> ccccccc
4a6
> pppppp
其中,3a4
3代表第一个文件中的第3行,a(add)代表增加,4代表第二个文件中的行。
> ccccccc
,ccccccc代表增加的内容(第二个文件的第四行),后就与第二个文件内容相同。
理解起来就是:第一个文件的第3行后增加ccccccc(第二个文件的第4行)内容, 第一个文件的第4行后增加pppppp(第二个文件的第6行)内容,第一个文件才会与第二个文件一样。
那么,除了这种情况还有其他情况:
demo:
输出内容
3d2
< aaaaaa
代表第一个文件删除第3行内容(aaaaaa)后与文件二相同。
< aaaaaa
代表第一个文件中须删除的内容。
demo:
输出内容为:
4c4
< ddddd
---
> eeeee
表示 第一个文件的第4行变为第二个文件的第4行。< ddddd
第一个文件该去除第4行的内容。
---
表示分割第一个文件和第二个文件。
> eeeee
表示第二个文件增加了第4行的内容。
diff常用参数:
diff的所有参数可以使用man diff
进行查看,这里列出常用参数。
参数 | 作用 |
---|---|
-b | 不检测空格 |
-B | 不检测空白行 |
-c | 显示文件所有内容并标识不同 |
-i | 不检测大小写 |
-r | 对比目录 |
u | 以合并的方式来显示文件内容的不同 |
-b:不检测空格
这里第二个文件中的第一行后比第一个文件中多一个空格,在使用diff命令可以对比出来。
此时使用-b参数可以不检测空格进行对比:
-B:不检测空行进行对比
第一个文件与第二个文件完全相同。这里在第二个文件后插入一空行,使用diff命令可以看到能够检测出空格:
使用参数-B进行跳过空行:
-c:显示文件所有内容并标识不同
这里依然沿用-B参数的例子,第二个文件比第一个文件多一个空行,使用-c参数可以显示文件所有内容并标识不同。
-i:不检测大小写
-r:对比目录
首先建立实验素材:
创建两个目录dir1、dir2。在dir1中建立新文件file1:
使用diff -r 参数进行对比:
-u:以合并的方式来显示文件内容的不同
可以看到,第一个文件与第二个文件只有中间的b大小写不同,在使用-u参数可以合并所有内容输出,并显示怎么操作才能与模板相同(模板是第二个文件),第一次对比:模板为xxx.conf.new 对比文件为xxx.conf。对比结果为-bbbbb
xxx.conf应该删除bbbbb,+BBBBB
增加BBBBB。
第二次将两文件调换位置,模板为xxx.conf,对比文件为xxx.conf.new。对比结果与第一次不同,-BBBBB
删去BBBBB,+bbbbb
增加bbbbb 才能与模板文件相同。
可以使用diff -u参数将合并的内容及不同输出到一个文件中做补丁文件:
diff -u xxx.conf xxx.conf.new> xxx.conf.path
这里就用到了patch
2、patch
patch 命令用于打补丁,补丁文件是使用diff产生的。
所谓打补丁,就是当有补丁文件时(一般由diff命令产生),将补丁打在需要变更的文件上,没有变动的内容不动,只动有变化的部分。大大提高文件更新的效率。
关于patch命令的用法,详细内容及更多参数查看man patch。
patch 【参数】 原文件 补丁文件
在使用patch命令前,首先安装patch:
使用diff生成补丁后,对文件打补丁:
但是,可以看到结果是文件根据补丁内容做了修改,但是xxx.conf原文件已经没有了,xxx.conf目前是已经修改过的文件。
这里可以使用-b参数来进行备份原文件:
可以看到,在打完补丁后,生成一个以.orig后缀的文件,即补丁前原文件。
3、cut
cut主要用于截取数据
用法:
cut 参数 文件
详细用法参考 man cut
常用参数:
参数 | 作用 |
---|---|
-d | 指定分隔符,缺省状态分隔符为空格 |
-f | 指定列数 |
-c | 切割字符 |
–complement | 提取指定字段之外的列 |
cut 主要用于对列的截取,对于数据的截取,一般是截取指定行和指定列来达到截取数据目的。
实验素材:将系统passwd文件拷贝出用作实验
数据内容:
可以看到,文件内的数据都以:为分隔。
对于行的截取,可以使用head 和 tail这两个命令:
截取第四行的内容:
可以使用head -n 4
来截取前四行的内容,再通过管道符对已经截取的内容使用tail -n 1
截取最后一行,来达到截取行的目的。
对于截取列,可以使用cut命令,参数 -d为指定分隔符,-f为指定列数:
所以,可以使用head tail cut 命令来截取我们想要的数据。
数字表达方式:
截取第一列到第三列:cut -d : -f 1-3 passwd
截取第一列和第三列:cut -d : -f 1,3 passwd
截取第二列到最后一列:
截取第一列到第五列:
截取第一列字母到第六列字符:
截取第一列字符和第六列字符:
cut -d : -f2 --complement passwd
提取指定第二列字段之外的列:
练习:输出网卡的ip地址,只能有ip:
4、sort
sort是用来排序的命令
用法:sort 参数 文件
常用参数:
参数 | 含义 |
---|---|
-n | 以纯数字进行排列 |
-r | 倒叙排列 |
-u | 去除重复项 |
-t | 指定分隔符 |
-k | 指定列数 |
-o | 输出到指定文件 |
新建素材文件:
可以看到,所有数字为乱序,使用sort进行排序:
可以看到,直接使用sort是对第一列的数字进行了排序。
使用参数-n是以纯数字进行排序:
使用-r参数进行逆序:
使用-u参数进行去重:
使用 -o参数可以将排序结果输出到文件中:
有的时候排序是对某一列进行排序,该怎么排序?
素材文件:
-t指定分隔符,-k指定列数:
5、uniq
uniq 可检查文本文件中重复出现的行列。
实验素材:
使用uniq直接可以对文件内容的连续重复行去重,使用-c参数可以统计重复行的重复次数,使用-d参数则可以显示文件中的重复行:
这里我们以/etc目录来查找:
第一步:ls -l
显示目录中所有文件的属性
可以看到第五大列为大小,使用sort对第五列进行逆序排序:
ls -l | sort -nrt ' ' -k 8
得到大小逆序排列后使用head -n2
命令将排名前两个截取:
然后使用cut将最后一列的文件名进行截取:
6、tr
tr命令常被用作大小写转换
cat passwd |tr 'a-z' 'A-Z' ## 将passwd中的小写转为大写
同理,将大写换为小写为:
cat passwd |tr 'A-Z' 'a-z' ## 将passwd中的大写转为小写
7、&&和||
&&和||在shell中代表的是 是非判断
使用方法:条件&& 条件成立做的事情||条件不成立做的事情
8、test
test命令功能:用于查看某个条件是否成立,它可对数值,字符,文件进行测试 。
demo:
在shell脚本中,[ ]也为test命令:
注意:在使用[ ]当作test时,中括号内格式问题,左右两边有空格!
test对数字的判定
参数 | 作用 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-le | 小于等于 |
-lt | 小于 |
-ge | 大于等于 |
-gt | 大于 |
test的条件关系:
Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。
test的字符判定
命令 | 作用 |
---|---|
test –n(nozero) 字符串 | 字符串的长度非零 |
test –z (zero)字符串 | 字符串的长度为零 |
test 字符串1=字符串2 | 字符串相等 |
test 字符串1!=字符串2 | 字符串不等 |
test对于文件的判定
参数 | 作用 |
---|---|
-ef | 判断文件节点好是否一致(硬链) |
-nt | 文件1是否比文件2新 |
-ot | 文件1是否比文件2老 |
-d | 是否为目录 |
-s | 文件存在且为套接字 |
-L(-h) | 判断文件存在且为软连接 |
-e | 判断文件是否存在 |
-f | 判断是否为普通文件 |
-b | 判断文件存在且为块设备 |
-c | 判断文件存在且为字符设备 |
-nt:文件1是否比文件2新
-ot:文件1是否比文件2老
-ef|判断文件节点好是否一致(硬链)
-d:是否为目录
-s:文件存在且为套接字
-L(-h):判断文件存在且为软连接
-e:判断文件是否存在
-b|判断文件存在且为块设备
-c:判断文件存在且为字符设备
练习:
编写脚本完成以下条件:
file_chech.sh在执行时,未指定检测文件报错:未指定检测文件,请指定!若指定文件不错在 报错:此文件不存在!
当文件存在时,检测文件类型并输出。
[root@node1 mnt]# cat check_file.sh
#!/bin/bash
[ -n "$1" ] || {
echo "未指定检测文件,请指定!"
exit
}
[ -e "$1" ] || {
echo "此文件不存在!"
exit
}
[ -d "$1" ] && {
echo "此文件为目录"
exit
}
[ -S "$1" ] && {
echo "此文件为套接字文件"
exit
}
[ -S "$1" ] && {
echo "此文件为套接字文件"
exit
}
[ -L "$1" ] && {
echo "此文件为软连接文件"
exit
}
[ -f "$1" ] && {
echo "此文件为普通文件"
exit
}
[ -b "$1" ] && {
echo "此文件为块设备文件"
exit
}
[ -c "$1" ] && {
echo "此文件为字符设备文件"
exit
}