一、diff和patch命令
diff通常比较文件的内容,patch常用来打补丁,二者配合使用。
1、比较内容
cat file1
123
haha
cat file2
123
nihao
diff file1 file2 ##注意是以第二个文件为基准的
2c2 ##第一个文件的第2行 修改变成 第二个文件的第2行
< haha < 表示第一个文件中的内容
---
> nihao > 表示第二个文件中的内容
a 表示添加 ----add
c 表示更改 ----change
d 表示删除 ----delete
< 表示第一个文件中的内容, > 表示第二个文件中的内容, --- 分割线
123
cat file2
123
nihao
diff file1 file2
1a2 ##第一个文件的第1行 添加 第二个文件的第2行
> nihao
diff file2 file1
2d1 ##第一个文件的第2行 删除 变成 第二个文件的第1行
< nihao
diff /etc/passwd /etc/shadow
1,39c1,39 ##!!!注意,这里1,39是1-39的意思,不是1和39的意思,是39行
< root:x:0:0:root:/root:/bin/bash
< bin:x:1:1:bin:/bin:/sbin/nologin
< daemon:x:2:2:daemon:/sbin:/sbin/nologin
< adm:x:3:4:adm:/var/adm:/sbin/nologin
2、生成补丁
diff -u file2 file1 ##-u 产生补丁 注意:这里一定是和后者做比较
--- file2 2018-06-10 10:38:12.882174676 -0400
+++ file1 2018-06-10 10:43:30.352174676 -0400
@@ -1,2 +1 @@
123
-nihao
diff -u file2 file1 > file2.path ##把补丁导入.path文件,注意后缀,注意是以后一个文件为基准,补丁是对前一个打补丁
ls
file1 file2 file2.path
3,打补丁
ls
file1 file2 file2.path
yum install patch -y ##安装patch打补丁软件
cat file1
123
cat file2
123
nihao
cat file2.path ##查看补丁
--- file2 2018-06-10 10:38:12.882174676 -0400
+++ file1 2018-06-10 10:43:30.352174676 -0400
@@ -1,2 +1 @@
123
-nihao
patch file2 file2.path ##给file2打补丁,此时file2和file1就一样了
patching file file2
cat file2
123
这样打补丁原文件就没有了
ls
file1 file2 file2.path
4,保留原文件并打补丁
cat file3
123
haha
cat file1
123
diff -u file1 file3 > file1.path ##生成file1的补丁
patch -b file1 file1.path ##-b,打补丁的同时,备份原文件
patching file file1
cat file1 ##此时file1和file3的内容一样了
123
haha
ls ##保留了原文件,file1.orig就是原文件
file1 file1.orig file1.path file2 file2.path file3
5,diff比较目录
diff -r /etc/ /mnt/ ##比较目录需要加上-r,比较的结果是目录中文件的不同,而不是文件内容的不同
Only in /etc/: abrt
Only in /etc/: adjtime
二、cut命令
通常用来截取
cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
1、截取段
cut -d : -f 1 passwd ## -d 指定分隔符为: -f 指定要截取的列 第1列
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
cut -d : -f 1,3 passwd ##-d 指定分隔符 -f 指定要截取的列 第1和3列
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
cut -d : -f 1-3 passwd ##-d 指定分隔符 -f 指定要截取的列 第1到3列
root:x:0
bin:x:1
daemon:x:2
adm:x:3
lp:x:4
sync:x:5
shutdown:x:6
halt:x:7
mail:x:8
operator:x:11
games:x:12
ftp:x:14
cut -d : -f 3- passwd ##-d 指定分隔符 -f 指定要截取的列 第3列之后
0:0:root:/root:/bin/bash
1:1:bin:/bin:/sbin/nologin
2:2:daemon:/sbin:/sbin/nologin
3:4:adm:/var/adm:/sbin/nologin
4:7:lp:/var/spool/lpd:/sbin/nologin
5:0:sync:/sbin:/bin/sync
6:0:shutdown:/sbin:/sbin/shutdown
7:0:halt:/sbin:/sbin/halt
8:12:mail:/var/spool/mail:/sbin/nologin
11:0:operator:/root:/sbin/nologin
12:100:games:/usr/games:/sbin/nologin
14:50:FTP User:/var/ftp:/sbin/nologin
2、截取字符
cut -c 1-3 passwd ##-c 指定截取的字符的位置,第1-3列
roo
bin
dae
adm
lp:
syn
shu
hal
mai
ope
gam
ftp
cut -c 1,3 passwd ##-c 指定截取的字符的位置,第1和3列
ro
bn
de
am
l:
sn
su
hl
mi
oe
gm
fp
三、shell编程中的条件表示&&,||
&& 用来执行条件成立后执行的命令
|| 用来执行条件不成立后执行的命令
四,sort命令和uniq命令
sort命令通常用来排序
uniq命令对重复字符做相应的处理
1、测试
cat numbers
1
3
5
34
10
2
1
5
1
1
sort numbers ##默认是正向排序,而且是对每行的第一个单个数字进行排序
1
1
1
1
10
2
3
34
5
5
sort -n numbers ##-n 表示纯数字排序
1
1
1
1
2
3
5
5
10
34
sort -r numbers ## -r 表示反向排序,也是对每行的第一个单个数字排序
5
5
34
3
2
10
1
1
1
1
sort -rn numbers ##反向纯数字排序
34
10
5
5
3
2
1
1
1
1
sort -rn numbers -o NUM ##-o 指定输出文件
cat NUM
34
10
5
5
3
2
1
1
1
1
sort -u numbers ##-u表示unique独一无二的,去掉重复数字
1
10
2
3
34
5
sort -urn numbers ##去掉重复数字纯数字反向排序
34
10
5
3
2
1
vim可视化列插入:ctrl+v > 选择列 > 输入大写的I > 输入字符 > esc
cat numbers
1:1
2:3
5:5
2:34
22:10
1:2
3:1
2:5
10:1
3:1
sort -t : -k 2 numbers ## -t 指定分隔符为: -k 指定列 第2列 !!!!!注意,对列进行处理,行内容不会改变
10:1
1:1
3:1
3:1
22:10
1:2
2:3
2:34
2:5
5:5
sort -t : -k 2 numbers -n ## 以:为分隔符,对第2列纯数字正向排序
10:1
1:1
3:1
3:1
1:2
2:3
2:5
5:5
22:10
2:34
sort -t : -k 1 numbers -rnu ## 以:为分隔符 ,对第一列去掉重复数字之后反序
22:10
10:1
5:5
3:1
2:3
1:1
cat numbers
1
3
5
34
10
2
1
5
1
1
sort -n numbers | uniq -c ##进行纯数字排序之后 重复数字只显示一次,并且在左边显示重复次数
4 1
1 2
1 3
2 5
1 10
1 34
sort -n numbers | uniq -d ##进行纯数字排序之后显示重复的行
1
5
sort -n numbers | uniq -u ##进行纯数字排序之后显示不重复的行
2
3
10
34
五、test命令
test命令通常做判断 test 命令和 [ ] 等同
注意 括号两边都应该有空格
[ "$A" = "$B" ] ##是否相等
[ "$A" != "$B" ] ##是否不相等
[ "$A" -eq "$B" ] ##是否相等
[ "$A" -ne "$B" ] ##是否不相等
[ "$A" -le "$B" ] ##是否小于
[ "$A" -lt "$B" ] ##是否小于等于
[ "$A" -ge "$B " ] ##是否大于
[ "$A" -gt "$B" ] ##是否大于等于
[ "$A" -ne "$B" -a "$A" -gt "$B" ] ##A 不等于 B 并且 A 大于等于B
[ "$A" -ne "$B" -o "$A" -gt "$B" ] ##A不等于B 或者 A大于等于B
[ -z "$A" ] ##是否为空
[ -n "$A" ] ##是否不为空
test File1 –ef File2 两个文件是否为同一个文件,可用于硬连接。主要判断两个文件是否指向同一个inode!!!!
test File1 –nt File2 判断文件1是否比文件2新
test File1 –ot File2 判断文件1比是否文件2旧
-b<文件>:如果文件为一个块特殊文件,则为真;
-c<文件>:如果文件为一个字符特殊文件,则为真;
-d<文件>:如果文件为一个目录,则为真;
-e<文件>:如果文件存在,则为真;
-f<文件>:如果文件为一个普通文件,则为真;
-S<文件>:如果文件为一个套接字特殊文件,则为真;
–L File : 文件是否是一个符号链接
1、测试
a=1 ##给1,2赋值
b=2
test "$a" = "$b" && echo yes || echo no ##test判断,如果相等,打印yes,如果不相等,打印no
no
b=1
test "$a" = "$b" && echo yes || echo no
yes
["$a" = "$b"] && echo yes || echo no ##!!!!!!!!!!! [ ]内容的左右两侧有空格,否则会报错
bash: [1: command not found...
no
[ "$a" = "$b" ] && echo yes || echo no
yes
2、测试
a=0
echo $a ##不是打印$a,而是打印变量a的值
0
echo $c ##没有给c赋值,所以值就是空
[ -z "$c" ] && echo yes || echo no ##-z 是否为空
yes
[ -n "$c" ] && echo yes || echo no ##-n 是否不为空 即是否有值
no
[ -z "$a" ] && echo yes || echo no
no
[ -n "$a" ] && echo yes || echo no
yes
3、测试
ls
[ -e "file" ] && echo yes || echo no ##file不存在
no
touch file
[ -e "file" ] && echo yes || echo no ##file存在
yes
[ -f "file" ] && echo yes || echo no ##file是普通文件
yes
[ -L "file" ] && echo yes || echo no ##file不是软连接文件
no
ln -s /etc/passwd passwd ##建立软连接!!!passwd原来不存在的
ll
total 0
-rw-r--r--. 1 root root 0 Jun 14 02:51 file
lrwxrwxrwx. 1 root root 11 Jun 14 02:53 passwd -> /etc/passwd
[ -L "passwd" ] && echo yes || echo no ##passwd是软连接
yes
[ -S "/run/rpcbind.sock" ] && echo yes || echo no ##/run/rpcbind.sock是套接字
yes
[ -b "/dev/vdb" ] && echo yes || echo no ##/dev/vdb是块设备
yes
[ -c "/dev/pts/0" ] && echo yes || echo no ##/dev/pts/0是字符设备
yes
六、tr命令
tr命令通常用于大小写转换
示例:判断输入是不是hello
vim hello.sh
cat hello.sh ##判断输入是不是hello
#!/bin/bash
[ "$1" = "hello" ] && {
echo yes
} || {
echo no
}
sh hello.sh hello
yes
sh hello.sh HELLO ##存在大小写的错误
no
小写字母转换为大写字母
tr 'a-z' 'A-Z' < hello.sh ##注意书写格式 'a-z' 'A-Z' 是小写字母转大写字母
#!/BIN/BASH
[ "$1" = "HELLO" ] && {
ECHO YES
} || {
ECHO NO
}
大写字母转换为小写字母
tr 'A-Z' 'a-z' < hello.sh ##注意书写格式 'A-Z' 'a-z' 是大写转换为小写
#!/bin/bash
[ "$1" = "hello" ] && {
echo yes
} || {
echo no
}
修改脚本
#!/bin/bash
WORD=$( echo $1 | tr 'A-Z' 'a-z' ) ##输入由大写转换为小写,并且作为一个变量存在,前面要加$符号
[ "$WORD" = "hello" ] && { ##由于之前的$1已经被处理过了,所以这里写$1逻辑上是有问题的,应该改为我们自己的变量名称
echo yes
} || {
echo no
}
测试
sh hello.sh HELLO ##现在也可以时别大写
yes
sh hello.sh hello
yes