SHELL(1)shell中常用的基础命令


1.diff

用法:
diff [options] files|directorys

输出信息:
[num1,num2][a|c|d][num3,num4]
num1,num2 ##第一个文件中的行,num3,num4 ##第二个文件中的行

指令 含义
a 添加
c 更改
d 删除
< 第一个文件中的内容。第一个文件比第二个文件多的内容
> 第二个文件中的内容。第二个文件比第一个文件多的内容
常用参数 含义
-b 忽略空格
-B 忽略空行
-i 忽略大小写
-c 显示文件所有内容并并用!标示不同
-r 对比目录
-u 合并输出(是指把不同的位置合并输出,而不是把所有的内容合并输出)

代码:

[root@node1 ]# cd /mnt
[root@node1 mnt]# vim westos 
[root@node1 mnt]# vim  westos1
[root@node1 mnt]# cat westos
hello westos
[root@node1 mnt]# cat westos1
hello westos
123
[root@node1 mnt]# diff westos westos1
1a2
> 123
[root@node1 mnt]# vim westos
[root@node1 mnt]# cat westos
hello  westos  #两个空格
[root@node1 mnt]# diff westos westos1   
1c1,2
< hello  westos
---
> hello westos
> 123
[root@node1 mnt]# diff -b westos westos1  ##忽略空格
1a2
> 123
[root@node1 mnt]# diff -B  westos westos1 #忽略空行
[root@node1 mnt]# diff -Bi westos westos1  #忽略空行和大小写
1a2
> 123
[root@node1 mnt]# diff -c westos westos1  #显示文件所有内容并用!标示不同
[root@node1 mnt]# mkdir westosdir westosdir1
[root@node1 mnt]# touch westosdir/westosfile
[root@node1 mnt]# diff -r westosdir westosdir1  # -r 比较目录
Only in westosdir: westosfile
[root@node1 mnt]# diff -u westos westos1   #合并输出(是指把不同的位置合并输出,而不是把所有的内容合并输出)
[root@node1 mnt]# ls
westos  westos1  westosdir  westosdir1

在这里插入图片描述

在这里插入图片描述

2.patch

用法 patch 原文件 布丁文件
-b 备份原文件
[root@node1 mnt]# dnf install patch -y 
[root@node1 mnt]# vim westos
[root@node1 mnt]# cat westos
Hello westos
[root@node1 mnt]# cat westos1
hello westos
456
[root@node1 mnt]# diff -u westos westos1 > westos.path
[root@node1 mnt]# ls
westos  westos1  westosdir  westosdir1  westos.path
[root@node1 mnt]# cat westos.path
--- westos	2020-12-15 14:35:24.647000000 +0900
+++ westos1	2020-12-15 14:33:42.758000000 +0900
@@ -1 +1,2 @@
-Hello westos
+hello westos
+456
[root@node1 mnt]# patch -b westos westos.path #patch  原文件 布丁文件;-b##备份原文件
patching file westos
[root@node1 mnt]# ls
westos  westos1  westosdir  westosdir1  westos.orig  westos.path
[root@node1 mnt]# cat westos
hello westos
456

在这里插入图片描述

3.cut

参数 含义
-d : 指定:为分隔符
-f 指定显示的列 5第五列; 3,5 3和5列;3-5 3到5列;5- 第五列以后;-5 到第五列
-c 指定截取的字符(数字用法同-f)
[root@node1 mnt]# cp /etc/passwd pa
[root@node1 mnt]# vim pa
[root@node1 mnt]# cut -d : -f 1 pa #-d :#指定:为分隔符;-f ##指定显示的列 5第五列| 3,5 3和5列|3-5 3到5列|5- 第五列以后|-5 到第五列

root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
dbus
systemd-coredump
systemd-resolve
tss
polkitd
[root@node1 mnt]# vim pa 
[root@node1 mnt]# 
[root@node1 mnt]# cut -d : -f 1 pa
root
bin
daemon
adm
lp
sync
shutdown
halt
[root@node1 mnt]# cut -d : -f 1,4
^C
[root@node1 mnt]# cut -d : -f 1,4 pa
root:0
bin:1
daemon:2
adm:4
lp:7
sync:0
shutdown:0
halt:0
[root@node1 mnt]# cut -d : -f 1-4 pa
root:x:0:0
bin:x:1:1
daemon:x:2:2
adm:x:3:4
lp:x:4:7
sync:x:5:0
shutdown:x:6:0
halt:x:7:0
[root@node1 mnt]# cut -d : -f 4- pa
0:root:/root:/bin/bash
1:bin:/bin:/sbin/nologin
2:daemon:/sbin:/sbin/nologin
4:adm:/var/adm:/sbin/nologin
7:lp:/var/spool/lpd:/sbin/nologin
0:sync:/sbin:/bin/sync
0:shutdown:/sbin:/sbin/shutdown
0:halt:/sbin:/sbin/halt
[root@node1 mnt]# cut -d : -2 pa
cut: invalid option -- '2'
Try 'cut --help' for more information.
[root@node1 mnt]# cut -d : -f -2 pa
root:x
bin:x
daemon:x
adm:x
lp:x
sync:x
shutdown:x
halt:x
[root@node1 mnt]# cut -c 1-3 pa  #-c##指定截取的字符(数字用法同-f)
roo
bin
dae
adm
lp:
syn
shu
hal

[root@node1 mnt]# grep bash -v /etc/passwd | cut -d : -f 1 /etc/passwd

在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.sort

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

代码:

[root@node1 mnt]# vim westos
[root@node1 mnt]# cat westos
4
3
5
2
7
9
1
7
5
4
3
6
3
33
54
11
11
[root@node1 mnt]# sort westos  #只按第一列数字的大小排序
1
11
11
2
3
3
3
33
4
4
5
5
54
6
7
7
9
[root@node1 mnt]# sort -n westos ###纯数字排序
1
2
3
3
3
4
4
5
5
6
7
7
9
11
11
33
54

[root@node1 mnt]# 
[root@node1 mnt]# sort -nr westos##纯数字倒叙
54
33
11
11
9
7
7
6
5
5
4
4
3
3
3
2
1
[root@node1 mnt]# sort -nr westos -o westos1#-o	##输出到指定文件
[root@node1 mnt]# vim westos
[root@node1 mnt]# cat westos
3:4
5:3
6:5
4:2
2:7
8:9
8:1
8:7
8:5
8:4
8:3
8:6
8:3
8:33
8:54
8:11
8:11


[root@node1 mnt]# sort -n -t : -k 2 westos#-n纯数字排序;-t##指定分隔符;-k##指定排序的列
8:1
4:2
5:3
8:3
8:3
3:4
8:4
6:5
8:5
8:6
2:7
8:7
8:9
8:11
8:11
8:33
8:54

5.uniq

参数 含义
-c 合并重复并统计重复个数
-d 显示重复的行
-u 显示唯一的行

代码:

[root@node1 mnt]# cat westos
4
3
5
2
7
9
1
7
5
4
3
6
3
33
54
11
11
[root@node1 mnt]# uniq -c westos#合并重复并统计重复个数,前面的数字是出现的次数
      1 4
      1 3
      1 5
      1 2
      1 7
      1 9
      1 1
      1 7
      1 5
      1 4
      1 3
      1 6
      1 3
      1 33
      1 54
      2 11
[root@node1 mnt]# uniq -d westos#显示重复的行
11
[root@node1 mnt]# uniq -u westos#显示唯一的行
4
3
5
2
7
9
1
7
5
4
3
6
3
33
54

[root@node1 mnt]# uniq -c westos
      1 4
      1 3
      1 5
      1 2
      1 7
      1 9
      1 1
      1 7
      1 5
      1 4
      1 3
      1 6
      1 3
      3 33
      1 54
      2 11
[root@node1 mnt]# uniq -c westos | sort -k 1 -nr | cut -d  " " -f 8 | head -n 1 #统计次数最多的那个,显示出来
33

在这里插入图片描述

学员命令测试:

1.ifconfig 网卡 可以显示此网卡的信息
显示信息中包含此网卡使用的ip地址
请用命令过滤此ip并在输出时只显示ip其他信息不显示

2.找出能登陆系统用户中UID最大的用户,并显示其名称

3.当前主机为web服务器,请抓取访问web服务器次数排在前5的ip地址
在这里插入图片描述

6.tr

[root@node1 ~]# ls
anaconda-ks.cfg  dead.letter  Der  initial-setup-ks.cfg
[root@node1 ~]# ls | tr 'A-Z' 'a-z'##大写转小写
anaconda-ks.cfg
dead.letter
der
initial-setup-ks.cfg
[root@node1 ~]# ls | tr 'a-z' 'A-Z'##小写转大写
ANACONDA-KS.CFG
DEAD.LETTER
DER
[root@foundation34 ~]# cat /etc/httpd/logs/access_log | cut -d " " -f 1 | sort -n | uniq -c  | tr " " "$"  #用$替换空格
$$$$$$2$10.4.17.141
$$$$$18$10.4.17.241

在这里插入图片描述

7.test

test = [] ##[] 就相当于test命令;即"test $a = b " = [ " b" = [ " b"=["a" = “$b” ]

[root@node1 mnt]# a=1
[root@node1 mnt]# b=1
[root@node1 mnt]# test "$a"="$b" && echo yes || echo no
yes
[root@node1 mnt]# [ "$a"="$b" ] && echo yes || echo no
yes
[root@node1 mnt]# [ "$a" != "$b" ] && echo yes || echo no
no
[root@node1 mnt]# a=2
[root@node1 mnt]# [ "$a" != "$b" ] && echo yes || echo no
yes
[root@node1 mnt]# [ "$a" -eq "$b" ] && echo yes || echo no
no
[root@node1 mnt]# [ "$a" -le "$b" ] && echo yes || echo no
no
[root@node1 mnt]# [ "$a" -ge "$b" ] && echo yes || echo no
yes
[root@node1 mnt]# [ "$a" -lt "$b" ] && echo yes || echo no
no
[root@node1 mnt]# [ "$a" -gt "$b" ] && echo yes || echo no
yes
[root@node1 mnt]# [ "$a" -gt "0" -a "$a" -lt "10" ] && echo yes || echo no
yes
[root@node1 mnt]# echo $a
2
[root@node1 mnt]# echo $b
1
[root@node1 mnt]# a=15
[root@node1 mnt]# [ "$a" -gt "0" -a "$a" -lt "10" ] && echo yes || echo no  #a>0且a<10
no
[root@node1 mnt]# [ "$a" -le "0" -o "$a" -ge "10" ] && echo yes || echo no#a<=0或a>=10
yes
[root@node1 mnt]# [ "$a" -le "0" ]||[ "$a" -ge "10" ]  && echo yes || echo no#a<=0或a>=10
yes
[root@node1 mnt]# [ "$a" -gt "0" ]&&[ "$a" -lt "10" ] && echo yes || echo no#a>0且a<10
no

8.&& ||

&& 符合条件作动作,执行命令没问题时执行后面的命令
|| 不符合条件作动作

[root@node1 mnt]# ls /mnt &> /dev/nulll && echo yes || echo no  #前面的执行命令没问题时执行&&后面的命令;前面的执行命令有问题时执行||后面的命令
yes
[root@node1 mnt]# ls /mnt/hello &> /dev/nulll && echo yes || echo no
no

在这里插入图片描述

9.test数字对比

参数 含义
=
!=
-eq 等于
-ne 不等于
-le 小于等于
-lt 小于
-ge 大于等于
-gt 大于
test的条件关系
-a 并且
-o 或者
test对空的判定
-n nozero 判定内容不为空
-z zero 判定内容为空
执行下列脚本来判断用户类型

user_check.sh 用户

用户类型为
super user
system user
common user

[root@node1 mnt]# vim user_check.sh
#!bin/bash
[ -z "$1" ]&& {
  echo "Error:Please input username following script !!"
  exit
}

id $1 &> /dev/null || {
  echo "user $1 is not exist !!"
  exit
}

USER_UID=$(id -u $1)
USER_SHELL=$( grep $1 /etc/passwd | cut -d : -f 7)

[ "$USER_UID" -eq "0" ]&& {
  echo $1 is supper user
  exit
}

[ "$USER_UID" -lt "1000" ] && [ !"$USER_SHELL" = "/bin/bash" ]&&{
  echo $1 is systemuser
  exit
}
[ "$USER_UID" -ge "1000" ] && [ "$USER_SHELL" = "/bin/bash" ]&&{
  echo $1 is commonuser
  exit
}

echo "unknow user type !!"

[root@node1 mnt]# sh user_check.sh user1
user user1 is not exist !!
[root@node1 mnt]# useradd user1
[root@node1 mnt]# sh user_check.sh user1
user1 is commonuser
[root@node1 mnt]# usermod -s /sbin/nologin user1
[root@node1 mnt]# sh user_check.sh user1
unknow user type !!
[root@node1 mnt]# usermod -u 888 user1
[root@node1 mnt]# sh user_check.sh user1
unknow user type !!

在这里插入图片描述在这里插入图片描述

test对于文件的判定

参数 含义
-ef 文件节点号是否一致(硬链)
-nt 文件1是不是比文件2新
-ot 文件1是不是比文件2老
-d 目录
-S 套结字
-L 软连接
-e 存在
-f 普通文件
-b 快设备
-c 字符设备
[root@node1 mnt]# touch westos
[root@node1 mnt]# touch westos1
[root@node1 mnt]# [ "/mnt/westos" -ef "/mnt/westos1" ]
[root@node1 mnt]# [ "/mnt/westos" -ef "/mnt/westos1" ] && echo yes || echo no
no
[root@node1 mnt]# ln /mnt/westos /mnt/file
[root@node1 mnt]# ls -i
3215378 file  3215385 user_check.sh  3215378 westos  3215379 westos1
[root@node1 mnt]# [ "/mnt/westos" -ef "/mnt/file" ] && echo yes || echo no
yes
[root@node1 mnt]# [ "/mnt/westos" -nt "/mnt/westos1" ] && echo yes || echo no
no

[root@node1 mnt]# [ "/mnt/westos" -ot "/mnt/westos1" ] && echo yes || echo no
yes
[root@node1 mnt]# ll
total 4
-rw-r--r--. 2 root root   0 Dec 15 21:00 file
-rw-r--r--. 1 root root 518 Dec 15 20:01 user_check.sh
-rw-r--r--. 2 root root   0 Dec 15 21:00 westos
-rw-r--r--. 1 root root   0 Dec 15 21:01 westos1

[root@node1 mnt]# [ -L "/mnt/westos1" ] && echo yes || echo no
no
[root@node1 mnt]# [ -d "/mnt/westos1" ] && echo yes || echo no
no
[root@node1 mnt]# [ -d "/mnt" ] && echo yes || echo no
yes
[root@node1 mnt]# [ -f "/mnt/westos" ] && echo yes || echo no
yes
[root@node1 mnt]# [ -b "/mnt/westos" ] && echo yes || echo no
no
[root@node1 mnt]# [ -b "/dev/vda" ] && echo yes || echo no
yes
[root@node1 mnt]# [ -c "/dev/pts/0" ] && echo yes || echo no
yes
[root@node1 mnt]# [ -c "/mnt/westos" ] && echo yes || echo no

在这里插入图片描述在这里插入图片描述

学员检测

编写脚本完成以下条件
file_check.sh 在执行时
如果脚本后未指定检测文件报错“未指定检测文件,请指定”
如果脚本后指定文件不存在报错“此文件不存在”
当文件存在时请检测文件类型并显示到输出中

[root@foundation34 mnt]# vim file_check.sh
#!/bin/bash
[ -z "$*" ] && {
        echo "未指定检测文件。青指定"
        exit
}
[ -e "$*" ] || {
        echo "文件不存在"
        exit
}
[ -L "$*" ] && {
        echo "$*是个软链接"
        exit
}
[ -f "$*" ] && {
        echo "$*是个普通文件"
        exit
}
[ -b "$*" ] && {
        echo "$*是个块设备"
        exit
}
[ -c "$*" ] && {
        echo "$*是个字符设备"
        exit
}
[ -d "$*" ] && {
        echo "$*是个目录"
        exit
}
[ -S "$*" ] && {
        echo "$*是个套接字"
        exit
}

[root@foundation34 mnt]# sh file_check.sh /mnt
/mnt是个目录
[root@foundation34 mnt]# sh file_check.sh /mnt/westos
文件不存在
[root@foundation34 mnt]# touch westos
[root@foundation34 mnt]# sh file_check.sh /mnt/westos
/mnt/westos是个普通文件
[root@foundation34 mnt]# sh file_check.sh /dev/vda
文件不存在
[root@foundation34 mnt]# sh file_check.sh /dev/pts/0
/dev/pts/0是个字符设备

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qiao_qing/article/details/111236542