shell编程之常用指令

一,diff和patch命令

diff通常比较文件的内容,patch常用来打补丁

比较内容
[root@server1 mnt]# vim file1
[root@server1 mnt]# vim file2
[root@server1 mnt]# cat file1
123
haha
[root@server1 mnt]# cat file2
123
nihao

# 第一个文件的第2行 修改变成 第二个文件的第2行
# < 表示第一个文件中的内容 
# > 表示第二个文件中的内容
"""
a 表示添加 ----add
c 表示更改 ----change
d 表示删除 ----delete
"""
# 注意是以第二个文件为基准的
[root@server1 mnt]# diff file1 file2
2c2
< haha
---
> nihao

[root@server1 mnt]# diff file2 file1
2c2
< nihao
---
> haha


[root@server1 mnt]# cat file1
123
[root@server1 mnt]# cat file2
123
nihao
# 第一个文件的第1行  添加 第二个文件的第2行
[root@server1 mnt]# diff file1 file2
1a2
> nihao
# 第一个文件的第2行  删除 变成 第二个文件的第1行
[root@server1 mnt]# diff file2 file1
2d1
< nihao


2,生成补丁
# -u 产生补丁  注意:这里一定是和后者做比较
[root@server1 mnt]# diff -u file2 file1   
--- file2    2019-12-15 11:14:15.277000000 +0800
+++ file1    2019-12-15 11:16:41.129000000 +0800
@@ -1,2 +1 @@
 123
-nihao
# 把补丁导入.path文件,注意后缀,注意是以后一个文件为基准,补丁是对前一个打补丁
[root@server1 mnt]# diff -u file2 file1 > file2.path


3,打补丁
[root@server1 mnt]# ls
file1  file2  file2.path
[root@server1 mnt]# cat file1
123
[root@server1 mnt]# cat file2
123
nihao
# 查看补丁
[root@server1 mnt]# cat file2.path 
--- file2    2019-12-15 11:14:15.277000000 +0800
+++ file1    2019-12-15 11:16:41.129000000 +0800
@@ -1,2 +1 @@
 123
-nihao
# 此命令需要安装
# 给file2打补丁,此时file2和file1就一样了
[root@server1 mnt]# patch file2 file2.path 
patching file file2
[root@server1 mnt]# cat file2
123

# 但是 刚刚这样打补丁原文件就没有了
[root@server1 mnt]# ls
file1  file2  file2.path
[root@server1 mnt]# cat file2
123

4,保留原文件并打补丁
[root@server1 mnt]# cat file1
123
[root@server1 mnt]# cat file3
123
haha
# 生成file1的补丁
[root@server1 mnt]# diff -u file1 file3 >file1.path
# -b,打补丁的同时,备份原文件
[root@server1 mnt]# patch -b file1 file1.path 
patching file file1
# 此时file1和file3的内容一样了
[root@server1 mnt]# cat file1
123
haha
# 保留了原文件,file1.orig就是原文件
[root@server1 mnt]# ls
file1  file1.orig  file1.path  file2  file2.path  file3

5,diff比较目录
# 比较目录需要加上-r,比较的结果是目录中文件的不同,而不是文件内容的不同
[root@server1 mnt]# diff  -t /etc/ /mnt/
Only in /etc/: adjtime
Only in /etc/: aliases
Only in /etc/: aliases.db
Only in /etc/: alternatives
Only in /etc/: anacrontab
Only in /etc/: asound.conf
Only in /etc/: audisp

二,cut命令
通常用来截取
1,截取段 
# -d 指定分隔符为:   -f 指定要截取的列 第1列
[root@server1 mnt]# cut -d : -f 1 passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
tss
rpc
rpcuser
nfsnobody
apache
varnishlog
varnish

# -d 指定分隔符   -f 指定要截取的列  第1到3
[root@server1 mnt]# cut -d : -f 1,3 passwd
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
nobody:99
systemd-network:192
dbus:81
polkitd:999
postfix:89
sshd:74
tss:59
rpc:32
rpcuser:29
nfsnobody:65534
apache:48
varnishlog:998
varnish:997

# -d 指定分隔符   -f 指定要截取的列  第3列之后
[root@server1 mnt]# cut -d : -f 3- passwd 
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
99:99:Nobody:/:/sbin/nologin
192:192:systemd Network Management:/:/sbin/nologin
81:81:System message bus:/:/sbin/nologin
999:998:User for polkitd:/:/sbin/nologin
89:89::/var/spool/postfix:/sbin/nologin
74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
48:48:Apache:/usr/share/httpd:/sbin/nologin
998:995:varnishlog user:/dev/null:/sbin/nologin
997:995:Varnish Cache:/var/lib/varnish:/sbin/nologin


2,截取字符
# -c 指定截取的字符的位置,第1-3列
[root@server1 mnt]# cut -c 1-3 passwd 
roo
bin
dae
adm
lp:
syn
shu
hal
mai
ope
gam
ftp
nob
sys
dbu
pol
pos
ssh
tss
rpc
rpc
nfs
apa
var
var

# -c 指定截取的字符的位置,第1和3列
[root@server1 mnt]# cut -c 1,3 passwd 
ro
bn
de
am
l:
sn
su
hl
mi
oe
gm
fp
nb
ss
du
pl
ps
sh
ts
rc
rc
ns
aa
vr
vr

sort命令和uniq命令
sort命令通常用来排序
uniq命令对重复字符做相应的处理
"""

sort -n     纯数字排序
sort -r     倒叙
sort -u     去掉重复数字
sort -o     输出到指定文件中
sort -t     指定分隔符
sort -k     指定要排序的列

uniq -u     显示唯一的行
uniq -d     显示重复的行
uniq -c     每行显示一次并统计重复行数
"""

[root@server1 mnt]# cat numbers 
1
3
5
34
10
2
1
5
1
1
# 默认是正向排序,而且是对每行的第一个单个数字进行排序
[root@server1 mnt]# sort numbers 
1
1
1
1
10
2
3
34
5
5

# 反向纯数字排序
[root@server1 mnt]# sort -rn numbers
34
10
5
5
3
2
1
1
1
1

# -o 指定输出文件
[root@server1 mnt]# sort -rn numbers -o NUM
[root@server1 mnt]# cat NUM 
34
10
5
5
3
2
1
1
1
1

# -u表示unique独一无二的,去掉重复数字
[root@server1 mnt]# sort -u numbers
1
10
2
3
34
5

# 去掉重复数字纯数字反向排序
[root@server1 mnt]# sort -urn numbers 
34
10
5
3
2
1

# -t 指定分隔符为: -k 指定列 第2列   !!!!!注意,对列进行处理,行内容不会改变
[root@server1 mnt]#  sort -t : -k 2 numbers
10:1
1:1
3:1
3:1
22:10
1:2
2:3
2:34
2:5
5:5


# 以:为分隔符,对第2列纯数字正向排序
[root@server1 mnt]# sort -t : -k 2 numbers  -n
10:1
1:1
3:1
3:1
1:2
2:3
2:5
5:5
22:10
2:34

#  以:为分隔符 ,对第一列去掉重复数字之后反序
[root@server1 mnt]# sort -t : -k 1 numbers -rnu
22:10
10:1
5:5
3:1
2:3
1:1

[root@server1 mnt]# cat numbers 
1
3
5
34
10
2
1
5
1
1


# 进行纯数字排序之后 重复数字只显示一次,并且在左边显示重复次数
[root@server1 mnt]# sort -n numbers | uniq -c
      4 1
      1 2
      1 3
      2 5
      1 10
      1 34

# 进行纯数字排序之后显示重复的行
[root@server1 mnt]# sort -n numbers | uniq -d 
1
5
# 行纯数字排序之后显示不重复的行
[root@server1 mnt]# sort -n numbers | uniq -u 
2
3
10
34

"""
# 按照员工姓名进行排序
按照姓名,第一个区域进行比较即可:-k 1
[root@foundation0 ~]#  sort -t ' ' -k 1 info.txt 
lisi 170 25 6000
wangwu 170 28 5000
zhangsan 175 20 5000
zhangxiaoliu 165 30 6000

# 每列的信息:姓名 身高 年龄 工资
[root@foundation0 ~]# cat info.txt 
zhangsan 175 20 5000
lisi 170 25 6000
wangwu 170 28 5000
zhangxiaoliu 165 30 6000

# 按照员工身高进行排序
[root@foundation0 ~]# sort -t ' ' -n -k 2 info.txt 
zhangxiaoliu 165 30 6000
lisi 170 25 6000
wangwu 170 28 5000
zhangsan 175 20 5000
按照升高,数字要加 -n;第二个区域比较实用:-k 2,;
但是lisi和wangwu身高一样,这时默认会按照第一区域进行比较,所以lisi在前


"""

seq: squeue  是一个序列的缩写,主要用来输出序列化的东西
用法:seq [选项]... 尾数
 或:seq [选项]... 首数 尾数
 或:seq [选项]... 首数 增量 尾数
以指定增量从首数开始打印数字到尾数。
 
  -f, --format=格式     使用printf 样式的浮点格式
  -s, --separator=字符串        使用指定字符串分隔数字(默认使用:\n)
  -w, --equal-width    在列前添加0 使得宽度相同【自动补位】
      --help            显示此帮助信息并退出
      --version         显示版本信息并退出

指定分隔符  横着输出
[root@server1 mnt]# seq -s '#' 5
1#2#3#4#5

以空格作为分格,且输出单数
[root@server1 mnt]# seq -s ' ' 10
1 2 3 4 5 6 7 8 9 10

默认补位操作
[root@server1 mnt]# seq -w 10
01
02
03
04
05
06
07
08
09
10

产生-2~10内的整数,增量为2
[root@server1 mnt]# seq -2 2 10
-2
0
2
4
6
8
10

产生98~101之间的整数,并且要求输出数字宽度相同,不足的用空格补足
[root@server1 mnt]# seq -f "%03g" 98 101
098
099
100
101
[root@server1 mnt]# seq -f "%3g" 98 101   
 98
 99
100
101
# 注意:通过%后添加0替代空格补足空位


join命令
功能:“将两个文件里指定栏位同样的行连接起来”,即依照两个文件里共有的某一列,将相应的行拼接成一行。
join [options] file1 file2
注:这两个文件必须在已经在此列上是依照同样的规则进行了排序

[root@server1 ~]# join join1 join2
www onmpw com
domain jiyi cn
w3 blog net
[root@server1 ~]# cat join1 
www onmpw
domain jiyi
w3 blog
join command
ls l
[root@server1 ~]# cat join2
www com
domain cn
w3 net
Join org
wc l

# 看到结果了吗。在join1 和join2文件中前三行的第一列的数据相等,因此会将这三行数据拼接。对于其他两行因为第一列字符串并不相等,所以也就不会拼接了

# join默认是区分大小写的

将两个文件的具有共同域的纪录连接在一起:
# 改变域的分隔符
[root@server1 ~]# join -t: file.db file_hobby.db
A li:20:men:anhui:Song
B wang:21:women:jiangsu:shopping
C zhang:22:men:anhui:pingpong
D liu:23:women:Shanghai:chess
[root@server1 ~]# cat file.db 
A li:20:men:anhui
B wang:21:women:jiangsu
C zhang:22:men:anhui
D liu:23:women:Shanghai
E chen:23:women:Hefei
[root@server1 ~]# cat file_hobby.db 
A li:Song
B wang:shopping
C zhang:pingpong
D liu:chess
E Wang:reading


# 内连接(忽略不匹配的行)
[root@server1 ~]# join file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
[root@server1 ~]# cat file1
1 一月
2 二月
3 三月
4 四月
5 五月
6 六月
7 七月
8 八月
9 九月
10 十月
11 十一月
12 十二月
13 十三月
[root@server1 ~]# cat file2
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December
14 MonthUnknown


# 显示左边文件中的所有记录,右边文件中没有匹配的显示空白
[root@server1 ~]# join -a1 file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月

# 显示右边文件中的所有记录,左边文件中没有匹配的显示空白
[root@server1 ~]# join -a2 file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
14 MonthUnknown

# 全连接(又称全外连接,显示左边和右边所有记录)
[root@server1 ~]# join -a1 -a2 file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月
14 MonthUnknown

# 指定输出字段
#  -o 1.1 表示只输出第一个文件的第一个字段
[root@server1 ~]# join -o 1.1 file1 file2
1
2
3
4
5
6
7
8
9
10
11
12

# 指定输出多个字段
# 输出第一个文件的第一个字段,输出第二个文件第二个字段
[root@server1 ~]# join -o 1.1 2.2 file1 file2
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December

# 输出第一个文件的第一个字段和第二个字段,输出第二个文件第二个字段
[root@server1 ~]# join -o 1.1 2.2 1.2 file1 file2
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月

# 第一个文件第三个字段不存在的情况
[root@server1 ~]# join -o 1.1 1.2 1.3 2.2 file1 file2
1 一月  January
2 二月  February
3 三月  March
4 四月  April
5 五月  May
6 六月  June
7 七月  July
8 八月  August
9 九月  September
10 十月  October
11 十一月  November
12 十二月  December
[root@server1 ~]# join -o 1.1 1.2 2.2 file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December

# 指定分隔符
[root@server1 ~]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$6$pTycYIIhMhGpyE5d$FhiVzaqbtD8DKsTyxsEUZ.zr1IUeFfbMqEZP7utQFYRwkb6VOwJ974cou2QbRHT0d.oQwhCSYxK4uEZk/pfMQ/::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:17492:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:17492:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin:*:17492:0:99999:7:::
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin:*:17492:0:99999:7:::
sync:x:5:0:sync:/sbin:/bin/sync:*:17492:0:99999:7:::

# 不匹配的行输出
[root@server1 ~]# join -v 1 -a1 -a2  file1 file2
13 十三月
14 MonthUnknown

tr命令
tr,translate的简写
在这里用到的意思是转化,转变,转换
"""
-c, -C, –complement 用集合1中的字符串替换,要求字符集为ASCII。
-d, –delete 删除集合1中的字符而不是转换
-s, –squeeze-repeats 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
-t, –truncate-set1 先删除第一字符集较第二字符集多出的字符
"""
经过上面的help提示应该大致能够看明白tr的作用,tr是UNIX命令行家工具箱中的一款精美小工具,它经常用来编写优美的单行命令。主要用来对来自标准输入的字符串从set1映射到set2,并将其输出写入stdout(标准输出).set1和set2是字符类或字符集。如果两个字符集的长度不相等,那么set2会不断重复其最后一个字符,直到长度与set1相同。如果set2的长度大于set1,那么在set2中超出set1长度的那部分字符则全部被忽略

实际应用
实际应用1,大小写转换:
[root@server1 varnish]# echo "HI_AMOS" | tr "A-Z" 'a-z'
hi_amos
# "a-z"和"A-Z"都是集合(set),集合表示方式非常简单即"起始字符-终止字符"

实际应用2,加密解密:
[root@server1 varnish]# echo 12345 | tr '0-9' '987654321'
87654
[root@server1 varnish]# echo 87654 | tr '987654321' '0-9'
12345
# 上面是一个非常有趣的小例子,通过映射来实现简单的加密解密,看懂这个例子,可以接着往下看古罗马时期发明的凯撒加密的一种变体ROT13
[root@server1 varnish]# echo "hi,this is amosli" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
uv,guvf vf nzbfyv
[root@server1 varnish]# echo "uv,guvf vf nzbfyv" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
hi,this is amosli

# ROT13是它自己本身的逆反;也就是说,要还原ROT13,套用加密同样的算法即可得,故同样的操作可用再加密与解密

实际应用3,删除字符:
[root@server1 etc]# echo "hello 132 world 56 " | tr -d '0-9'
hello  world  

实际应用4,字符集补集:
tr -c [set1] [set2]
set1的补集意味着从这个集合中包含set1中没有的所有字符
最典型的用法就是从输入文本中将不在补集中的所有字符全部删除。例如:

[root@server1 etc]# echo "hello 123 world " | tr -d -c '0-9 \n'
 123  

实际应用5,用tr压缩字符:
[root@server1 etc]# echo "GNU is  not          UNIX . Recursicve right?" | tr -s  ' '
GNU is not UNIX . Recursicve right?

实际应用6,字符类:
[:digit:] 所有的数字
[:graph:] 所有可打印字符,不包括空格
[:lower:] 所有的小写字符
[:print:] 所有可打印字符,包括空格
[:punct:] 所有的标点字符
[:space:] 所有的横向或纵向的空白
[:upper:] 所有大写字母

[root@server1 ~]# echo amosli | tr '[:lower:]' '[:upper:]'
AMOSLI


 

发布了102 篇原创文章 · 获赞 14 · 访问量 2409

猜你喜欢

转载自blog.csdn.net/qq_41871875/article/details/104312902