Linux之shell学习(二)——常用命令

一、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

猜你喜欢

转载自blog.csdn.net/qq_43570369/article/details/88582719