一.shell的基本简介
在linux环境下,我们可以通过shell与内核交流,最终实现我们使用计算机资源的目的。
Shell是linux的一外壳,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口
当用户下达指令给操作系统的时候,实际上是把指令告诉shell,经过shell解释,处理后让内核做出相应的动作
系统的回应和输出的信息也由shell处理,然后显示在用户的屏幕上
二.shell的基本命令diff
作用:用来比较两个文件或目录的不同。
[root@server ~]# cd /mnt
[root@server mnt]# ls
[root@server mnt]# vim westos.old
[root@server mnt]# cat westos.old
hello westos
[root@server mnt]# vim westos.new
[root@server mnt]# cat westos.new
hello westos
123
[root@server mnt]# diff westos.old westos.new
1a2 ##a表示添加 即第一个文件的第一行加上第二个文件的第二行123与第二个文件相同
> 123 ##>表示第二个文件的内容
[root@server mnt]# diff westos.new westos.old
2d1 ##d表示删除 即第一个文件的第二行删除123与第二个文件的第一行相同
< 123 ##<表示第一个文件的内容
1.diff -b ##比较时不检查空格字符
[root@server mnt]# vim westos.old
[root@server mnt]# cat westos.old
hello westos
[root@server mnt]# vim westos.new
[root@server mnt]# cat westos.new
hello westos
[root@server mnt]# diff -b westos.new westos.old
2d1
<
< ##第一个文件的2行删除则与第2个文件相同,未监测到第1个文件的第一行比第2个文件多一个空格
2.diff -B ##不检查空白行
[root@server mnt]# diff -B westos.new westos.old
1,2c1 ##改变第一个文件的第1.2行,才能与第二个文件相同
< hello westos
<
---
> hello westos
[root@server mnt]# diff -Bb westos.new westos.old
[root@server mnt]#
3.diff -c ##显示全部内容并标明不同之处
[root@server mnt]# diff -c westos.new westos.old
*** westos.new 2019-05-13 06:41:13.564740130 -0400
--- westos.old 2019-05-13 06:39:32.654740130 -0400
***************
*** 1,2 ****
! hello westos ##第一个文件的1.2行不同 !表示不同
!
--- 1 ----
! hello westos
4.diff -i ##不检查大小写的不同
[root@server mnt]# vim westos.old
[root@server mnt]# cat westos.old
hello westos
[root@server mnt]# vim westos.new
[root@server mnt]# cat westos.new
HELLO WESTOS
123
[root@server mnt]# diff -i westos.new westos.old
2,3d1 ##比较时只比较出第一个文件相比于第二个文件多了空白行与123,未检查出大小写字母的区别
< 123
<
5.diff -p ##当检查的为c语言程序码文件时,显示差异所在的函数名称
[root@server mnt]# vim westos.c
[root@server mnt]# cat westos.c
#include<stdio.h>
main()
{
printf ("hello world\n");
}
[root@server mnt]# cp westos.c westos.c1
[root@server mnt]# vim westos.c1
[root@server mnt]# cat westos.c1
#include<stdio.h>
main()
{
printf ("hello world\n");
}
[root@server mnt]# diff westos.c westos.c1
4c4 ##改变第1个文件的第4行与第2个文件相同
< printf ("hello world\n");
---
> printf ("hello world\n");
[root@server mnt]# diff -p westos.c westos.c1
*** westos.c 2019-05-13 07:07:28.434740130 -0400 ##创建时间有差异
--- westos.c1 2019-05-13 07:08:24.591740130 -0400
***************
*** 1,5 ****
#include<stdio.h>
main()
{
! printf ("hello world\n"); ##! 表示不同处
}
--- 1,5 ----
#include<stdio.h>
main()
{
! printf ("hello world\n"); ##! 表示不同处
}
6.diff -q ##仅显示有无差异不显示详细信息
[root@server mnt]# diff -q westos.new westos.old
Files westos.new and westos.old differ
[root@server mnt]# diff -q westos.c westos.c1
Files westos.c and westos.c1 differ
7.diff -r ##比较子目录中的文件
[root@server mnt]# mkdir luck luckly ##创建两文件夹
[root@server mnt]# touch luck /file1 ##在一个文件夹建立一文件
[root@server mnt]# diff -r luck lucky
diff: lucky: No such file or directory ##比较时会发现两目录的不同之处是其中一个目录中无任何文件
8.diff -u ##以合并的方式比较两文件的不同
[root@server mnt]# vim westos.old
[root@server mnt]# cat westos.old
hello westos
haha
[root@server mnt]# vim westos.new
[root@server mnt]# cat westos.new
hello westos
haha
[root@server mnt]# diff -u westos.old westos.new
--- westos.old 2019-05-13 07:22:34.888740130 -0400
+++ westos.new 2019-05-13 07:23:31.476740130 -0400
@@ -1,2 +1,2 @@
-hello westos
+hello westos
haha
9.以补丁的方式对文件进行比较并修补
[root@server mnt]# diff -u westos.old westos.new > westos.path
[root@server mnt]# ls
luck luckly westos.new westos.old westos.path
[root@server mnt]# yum install patch -y ##安装补丁包
Loaded plugins: langpacks
Resolving Dependencies
--> Running transaction check
---> Package patch.x86_64 0:2.7.1-8.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
patch x86_64 2.7.1-8.el7 rhel7 110 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 110 k
Installed size: 210 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : patch-2.7.1-8.el7.x86_64 1/1
Verifying : patch-2.7.1-8.el7.x86_64 1/1
Installed:
patch.x86_64 0:2.7.1-8.el7
Complete!
[root@server mnt]# patch westos.old westos.path ##与补丁文件相同则不需要修补
patching file westos.old
[root@server mnt]# patch westos.new westos.path ##无备份的修补,修补完成后原文件消失
patching file westos.new
Reversed (or previously applied) patch detected! Assume -R? [n] ^C
[root@server mnt]# patch -b westos.new westos.path ##-b 有备份的修补
patching file westos.new
Reversed (or previously applied) patch detected! Assume -R? [n] yes
[root@server mnt]# ls ##westos.new.orig为原来的文件,则备份修补完成
luck luckly westos.new westos.new.orig westos.old westos.path
[root@server mnt]# cat westos.new
hello westos
haha
[root@server mnt]# cat westos.new.orig
hello westos
haha
三.shell的基本命令cut
1.cut -d ##指定截取的分隔符
cut -f ##指定截取的列
[root@server mnt]# cp /etc/passwd . ##复制passwd到/mnt
[root@server mnt]# ls
passwd
[root@server mnt]# vim passwd
[root@server mnt]# 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
[root@server mnt]# cut -d : -f 1 passwd ##截取第一列
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@server mnt]# cut -d : -f 1-3 passwd ##截取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
[root@server mnt]# cut -d : -f 1,3 passwd ##截取第1和第三列
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
2.cut -c ##指定截取的字符位置
[root@server mnt]# cut -c 1-4 passwd ##截取第1-4个字符
root
bin:
daem
adm:
lp:x
sync
shut
halt
mail
oper
[root@server mnt]# cut -c 1,4 passwd ##截取第一和第四个字符
rt
b:
dm
a:
lx
sc
st
ht
ml
or
3.测试:对本虚拟机的ip eth0进行截取仅截取ip
[root@server mnt]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.4.105 netmask 255.255.255.0 broadcast 172.25.4.255
inet6 fe80::5054:ff:fe00:40a prefixlen 64 scopeid 0x20<link>
ether 52:54:00:00:04:0a txqueuelen 1000 (Ethernet)
RX packets 4336 bytes 405099 (395.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2791 bytes 388152 (379.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
目的:仅截取172.25.4.105
[root@server mnt]# ifconfig eth0 | tail -n 8 | head -n 1
inet 172.25.4.105 netmask 255.255.255.0 broadcast 172.25.4.255
[root@server mnt]# ifconfig eth0 | tail -n 8 | head -n 1| cut -c 14-26 ##尝试截取,第14-26个字符为eth0的ip
172.25.4.105
[root@server mnt]# ifconfig eth0 | tail -n 8 | head -n 1| awk '{print $2}' ##读取该行并输出此行的第二个字段
172.25.4.105
[root@server mnt]# ifconfig eth0 | awk '/inet\> /{print $2}' ##读取inet行并输出第二个字段
172.25.4.105
四.shell的基本命令-sort
多用于数字的排列
1.sort -n ##纯数字排列
[root@server mnt]# vim test
[root@server mnt]# cat test
9
8
4
3
7
8
5
11
22
5
8
9
16
22
10
[root@server mnt]# sort -n test ##正序排列
3
4
5
5
7
8
8
8
9
9
10
11
16
22
22
2.sort -r ##反序排列
[root@server mnt]# sort -rn test
22
22
16
11
10
9
9
8
8
8
7
5
5
4
3
3.sort -u ##去掉重复数字进行排列
[root@server mnt]# sort -rnu test
22
16
11
10
9
8
7
5
4
3
4.sort -o ##输出到指定文件中
[root@server mnt]# sort -rnu test -o luck ##将反序不重复排列结果输出到luck文件中
[root@server mnt]# ls
luck passwd test
[root@server mnt]# cat luck
22
16
11
10
9
8
7
5
4
3
5.sort -t ##指定分隔符
sort -k ##指定要排列的序
[root@server mnt]# vim test
[root@server mnt]# cat test
3:9
3:8
3:4
3:3
1:7
1:8
1:5
1:11
1:22
4:5
4:8
4:9
4:16
4:22
4:10
[root@server mnt]# sort -t : -k 1 -n test ##对test数列的第1列进行排序
1:11
1:22
1:5
1:7
1:8
3:3
3:4
3:8
3:9
4:10
4:16
4:22
4:5
4:8
4:9
[root@server mnt]# sort -t : -k 2 -n test ##对test数列的第2列进行排序
3:3
3:4
1:5
4:5
1:7
1:8
3:8
4:8
3:9
4:9
4:10
1:11
4:16
1:22
4:22
6.测试:对/mnt中的所有文件按大小进行排列
[root@server mnt]# ls
luck passwd test
[root@server mnt]# ll
total 12
-rw-r--r-- 1 root root 24 May 13 08:05 luck
-rw-r--r-- 1 root root 385 May 13 07:39 passwd
-rw-r--r-- 1 root root 35 May 13 08:19 test
目的:将第5列按大小顺序排列
(1)
[root@server mnt]# ll |grep total -v | sort -t " " -k 5 -rn ##将total筛选出来再进行排列
-rw-r--r-- 1 root root 385 May 13 07:39 passwd
-rw-r--r-- 1 root root 35 May 13 08:19 test
-rw-r--r-- 1 root root 24 May 13 08:05 luck
(2)
[root@server mnt]# ll | tail -n 3 | sort -t " " -k 5 -rn
-rw-r--r-- 1 root root 385 May 13 07:39 passwd
-rw-r--r-- 1 root root 35 May 13 08:19 test
-rw-r--r-- 1 root root 24 May 13 08:05 luck
五.shell的基本命令uniq
1.uniq -c ##每行显示一次并统计重复次数
[root@server mnt]# vim test
[root@server mnt]# cat test
9
8
4
3
7
8
5
11
22
5
8
9
16
22
10
[root@server mnt]# sort -n test | uniq -c ##第一列为出现的次数
1 3 ##3出现1次
1 4
2 5 ##5出现2次
1 7
3 8 ##8出现3次
2 9
1 10
1 11
1 16
2 22
2. uniq -d ##显示重复的行
[root@server mnt]# sort -n test | uniq -d ##5 8 9 22均出现2次或2次以上
5
8
9
22
3.uniq -u ##显示唯一的行
[root@server mnt]# sort -n test | uniq -u
3
4
7
10
11
16
六.shell的基本命令-tr
1.tr:表示不区分大小写,并且可以进行字符转换
[root@dns-server mnt]# vim test
[root@dns-server mnt]# cat test
hello world
HELLO WORLD
[root@dns-server mnt]# tr 'A-Z' 'a-z' < /mnt/test ##将文件中的大写全部转换为小写
hello world
hello world
[root@dns-server mnt]# tr 'a-z' 'A-Z' < /mnt/test ##将文件中的小写全部转换为大写
HELLO WORLD
HELLO WORLD
2.测试:对于磁盘加密时可以不区分大小写进行加密
[root@dns-server mnt]# cryptsetup luksFormat /dev/vdb2 ##对磁盘/dev/vdb2进行加密
WARNING!
========
This will overwrite data on /dev/vdb2 irrevocably.
Are you sure? (Type uppercase yes): yes
[root@dns-server mnt]# cryptsetup luksFormat /dev/vdb2
WARNING!
========
This will overwrite data on /dev/vdb2 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase: ##设置加密密码
Verify passphrase:
Password quality check failed:
The password is shorter than 8 characters
注意:磁盘进行加密时,必须输入大写的YES,否则加密无法成功
此次实验的目的是在加密时不管输入小写还是大写均可以对磁盘进行加密
[root@dns-server mnt]# vim crypt_disk.sh
[root@dns-server mnt]# sh crypt_disk.sh /dev/vdb2
WARNING!
========
This will overwrite data on /dev/vdb2 irrevocably.
Are you sure? (Type uppercase yes): yes ##不再区分大小写
Enter passphrase:
Verify passphrase:
[root@dns-server mnt]# blkid ##查看可用磁盘
/dev/vda1: UUID="9bf6b9f7-92ad-441b-848e-0257cbb883d1" TYPE="xfs"
/dev/vdb1: UUID="SIaPf4-OdHu-OzAW-NlQG-vZ3D-X8ZO-1FK3Ih" TYPE="LVM2_member"
/dev/mapper/vg0-vo: UUID="12294be2-bdad-4817-b162-038e22313d9f" TYPE="ext4"
/dev/vdb2: UUID="5c47a5fd-2ca1-4412-96dc-7119e1a0d9da" TYPE="crypto_LUKS" ##加密成功