SHELL中常用的一些簡單命令

tst8023ryq發表於2020-12-15

1.diff

用法:
diff [options] files|directorys

輸出資訊:
[num1,num2][a|c|d][num3,num4]
num1,num2	##第一個檔案中的行
a		##新增
c		##更改
d		##刪除
<		##第一個檔案中的內容
>		##第二個檔案中的內容
num3,num4	##第二個檔案中的行

常用引數:
-b	##忽略空格
-B	##忽略空行
-i	##忽略大小寫
-c	##顯示檔案所有內容並標示不同
-r	##對比目錄
-u	##合併輸出
[root@localhost mnt]# cat westos
hello westos
[root@localhost mnt]# cat westos1
hello westos
123
[root@localhost mnt]# diff westos westos1
1a2
> 123
[root@localhost mnt]# vim westos1
[root@localhost mnt]# diff westos westos1
1c1,2
< hello westos
---
> hello  westos
> 123
[root@localhost mnt]# diff -b westos westos1
1a2
> 123
[root@localhost mnt]# diff -B westos westos1
[root@localhost mnt]# diff westos westos1
1c1
< hello westos
---
> Hello westos
[root@localhost mnt]# diff -i westos westos1
[root@localhost mnt]# diff -c westos westos1
*** westos	2020-12-14 16:24:43.062000000 +0800
--- westos1	2020-12-14 16:43:06.580000000 +0800
***************
*** 1 ****
--- 1,3 ----
+ 
  hello westos
+ 123
[root@localhost mnt]# mkdir westosdir westosdir1
[root@localhost mnt]# touch westosdir/westosfile
[root@localhost mnt]# diff -r westosdir westosdir1
Only in westosdir: westosfile
[root@localhost mnt]# diff -u westos westos1 > westos.path
[root@localhost mnt]# cat westos.path 
--- westos	2020-12-14 16:24:43.062000000 +0800
+++ westos1	2020-12-14 16:43:06.580000000 +0800
@@ -1 +1,3 @@
+
 hello westos
+123

2.patch

patch  原檔案 補丁檔案
-b	##備份原檔案
dnf install patch.x86_64 -y
[root@localhost mnt]# diff -u westos westos1 > westos.path
[root@localhost mnt]# patch -b westos westos.path
patching file westos
[root@localhost mnt]# ls
westos  westos1  westosdir  westosdir1  westos.orig  westos.path
[root@localhost mnt]# cat westos.orig  #備份的原檔案
hello westos
[root@localhost mnt]# cat westos
hello westos
123
[root@localhost mnt]# cat westos1
hello westos
123

3.cut

cut 
-d :	##指定:為分隔符
-f 	##指定顯示的列 5第五列| 3,5 3和5列|3-5 3到5列|5- 第五列以後|-5 到第五列
-c	##指定擷取的字元(數字用法同-f)
[root@localhost mnt]# grep bash -v /etc/passwd | cut -d : -f 1
bin
daemon
adm
lp
sync
shutdown
halt
mail

4.sort

sort
-n	##純數字排序
-r	##倒敘
-u	##去掉重複
-o	##輸出到指定檔案
-t	##指定分隔符
-k	##指定排序的列
[root@localhost mnt]# sort -n westos
1
2
5
6
8
8
9
9
12
26
68
68
[root@localhost mnt]# sort -nr westos
68
68
26
12
9
9
8
8
6
5
2
1
[root@localhost mnt]# sort -nr westos -o westos1
[root@localhost mnt]# cat westos1
68
68
26
12
9
9
8
8
6
5
2
1
[root@localhost mnt]# sort -u westos
1
12
2
26
5
6
68
8
9

[root@localhost mnt]# sort -t : -k 2 westos
6:1
2:12
2:2
8:26
5:5
2:6
0:68
8:68
0:8
0:8
0:9
1:9
[root@localhost mnt]# sort -t : -k 1 westos
0:68
0:8
0:8
0:9
1:9
2:12
2:2
2:6
5:5
6:1
8:26
8:68

5.uniq

uniq
-c	#合併重複並統計重複個數
-d	#顯示重複的行
-u	#顯示唯一的行
  • 1.ifconfig 網路卡 可以顯示此網路卡的資訊
    顯示資訊中包含此網路卡使用的ip地址
    請用命令過濾此ip並在輸出時只顯示ip其他資訊不顯示
[root@localhost mnt]# ifconfig enp1s0 | head -n  2 | tail -n 1 | cut -d " " -f 10
1.1.1.88
  • 2.找出能登陸系統使用者中UID最大的使用者,並顯示其名稱
[root@d mnt]# grep bash /etc/passwd | sort -t : -k 3 -nr | head -n 1 | cut -d : -f 1
lee
  • 3.當前主機為web伺服器,請抓取訪問web伺服器次數排在前5的ip地址
[root@localhost mnt]# cut -d " " -f 1 /etc/httpd/logs/access_log* | sort -n | uniq -c | sort -nr | head -n 5 | cut -d " " -f 7
[root@localhost mnt]# cut -d " " -f 1 /etc/httpd/logs/access_log* | sort -n | uniq -c | sort -nr | head -n 5 | sed 's/^ *//g' | cut -d " " -f 2
172.25.254.12
172.25.254.212
172.25.254.13

6.tr

tr 'a-z' 'A-Z'		##小寫轉大寫
tr  'A-Z' 'a-z'		##大寫轉小寫

[root@localhost mnt]# ifconfig enp1s0 | head -2 | tail -1 | cut -d " " -f 10
1.1.1.88
[root@localhost mnt]# ifconfig enp1s0 | head -2 | tail -1 | cut -d " " -f 10 | tr '1' '*'
*.*.*.88
[root@localhost mnt]# ls
passwd  westos
[root@localhost mnt]# ls | tr  'a-z' 'A-Z'
PASSWD
WESTOS

7.test

test = []	##[] 就相當於test命令
"test $a = $b" = [ "$a" = "$b" ]

test數字對比
=
!=
-eq		##等於
-ne		##不等於
-le		##小於等於
-lt		##小於
-ge		##大於等於
-gt		##大於

test的條件關係
-a	##並且
-o	##或者

test對空的判定
-n	##nozero 判定內容不為空
-z	##zero	判定內容為空

test對於檔案的判定
-ef		##檔案節點號是否一致(硬鏈)
-nt		##檔案1是不是比檔案2新
-ot		##檔案1是不是比檔案2老
-d		##目錄
-S		##套結字
-L		##軟連線
-e		##存在
-f		##普通檔案
-b		##快裝置
-c		##字元裝置
[root@node1 ~]# a=1
[root@node1 ~]# b=1
[root@node1 ~]# test "$a" = "$b" && echo yes || echo no
yes
[root@node1 ~]# [ "$a" -eq "$b" ] && echo yes || echo no  ##等於
[root@node1 ~]# [ "$a" -ne "$b" ] && echo yes || echo no  ##不等於
[root@node1 ~]# [ "$a" -le "$b" ] && echo yes || echo no ##小於等於
[root@node1 ~]# [ "$a" -ge "$b" ] && echo yes || echo no  ##大於等於
[root@node1 ~]# [ "$a" -lt "$b" ] && echo yes || echo no  ##小於
[root@node1 ~]# [ "$a" -gt "$b" ] && echo yes || echo no  ##大於
[root@node1 ~]# [ "$a" -gt "0" -a "$a" -lt "10" ] && echo yes || echo no  ##並且
[root@node1 ~]# [ "$a" -le "0" -o "$a" -ge "1" ] && echo yes || echo no  ##或者
[root@node1 ~]# [ "$a" -gt "0" ] && [ "$a" -lt "10" ] && echo yes || echo no
[root@node1 ~]# [ "$a" -gt "0" ] ||  [ "$a" -lt "1" ] && echo yes || echo no
[root@node1 ~]# [ -z "$c" ] && echo yes || echo no   ##zero	判定內容為空
yes
[root@node1 ~]# [ -n "$c" ] && echo yes || echo no   ##nozero 判定內容不為空
no
[root@node1 mnt]# [ "/mnt/westos" -ef "/mnt/westos1" ] && echo yes || echo no
no
[root@node1 mnt]# [ "/mnt/westos" -nt "/mnt/westos1" ] && echo yes || echo no
yes
[root@node1 mnt]# [ "/mnt/westos" -ot "/mnt/westos1" ] && echo yes || echo no
no
[root@node1 mnt]# [ -d "/mnt/"  ] && echo yes || echo no
yes
[root@node1 mnt]# ln -s /mnt/westos file1
[root@node1 mnt]# ln /mnt/westos /mnt/file
[root@node1 mnt]# [ -L "/mnt/file1"  ] && echo yes || echo no
yes
[root@node1 mnt]# [ -S "/mnt/file"  ] && echo yes || echo no
no
[root@node1 mnt]# [ -e "/mnt/file"  ] && echo yes || echo no
yes
[root@node1 mnt]# [ -c "/dev/vda"  ] && echo yes || echo no
no
[root@node1 mnt]# [ -b "/dev/vda"  ] && echo yes || echo no
yes
  • 執行下列指令碼來判斷使用者型別
    user_check.sh 使用者
    使用者型別為
    super user #uid=0
    system user #uid<1000,並且不能用於登陸作業系統
    common user #uid>=1000
[root@d mnt]# vim usercheck.sh
  1 #!/bin/bash
  2 [ -z "$1" ] && {
  3     echo "error:please input username following script!"
  4     exit
  5 }
  6 id $1 &> /dev/null || {
  7     echo "user $1 is not exist!" #當不能扔進垃圾箱時表示沒有該使用者
  8     exit
  9 }
 10 
 11 USER_UID=$( id -u $1 )
 12 USER_SHELL=$( grep $1 /etc/passwd | cut -d : -f 7 )
 13 [ "$USER_UID" -eq "0" ] && {
 14     echo $1 is supper user
 15     exit
 16 }
 17 [ "$USER_UID" -lt "1000" ] && [ "$USER_SHELL" != "/bin/bash" ] && {
 18     echo $1 is system user
 19     exit
 20 }
 21 [ "$USER_UID" -ge "1000" ] && [ "$USER_SHELL" = "/bin/bash" ] && {
 22     echo $1 is common user
 23     exit
 24 }
 25 echo "unknow user type"
 
 測試:
[root@d mnt]# sh usercheck.sh westos
westos is common user
[root@d mnt]# sh usercheck.sh linux
user linux is not exist!
[root@d mnt]# sh usercheck.sh lee
lee is common user
[root@d mnt]# sh usercheck.sh nginx
nginx is system user
[root@d mnt]# sh usercheck.sh root
root is supper user
  • 編寫指令碼完成以下條件
    file_check.sh 在執行時
    如果指令碼後未指定檢測檔案報錯“未指定檢測檔案,請指定”
    如果指令碼後指定檔案不存在報錯“此檔案不存在”
    當檔案存在時請檢測檔案型別並顯示到輸出中
[root@d mnt]# vim filecheck.sh 
  1 #!/bin/bash
  2 [ -z "$1" ] && {
  3     echo error: please input file following script!
  4     exit
  5 }
  6 ls -ld $1 > /dev/null || [ -e "$1" ] || {
  7     echo error:not found $1
  8     exit
  9 }
 10 [ -d "$1" ] && {
 11     echo $1 is 目錄
 12     exit
 13 }
 14 [ -S "$1" ] && {
 15     echo $1 is 套接字
 16     exit
 17 }
 18 [ -L "$1" ] && {
 19     echo $1 is 軟連線
 20     exit
 21 }
 22 [ -f "$1" ] && {
 23     echo $1 is 普通檔案
 24     exit
 25 }
 26 [ -b "$1" ] && {
 27     echo $1 is 快裝置
 28     exit
 29 }
 30 [ -c "$1" ] && {
 31     echo $1 is 字元裝置
 32     exit
 33 }

測試:
[root@node1 mnt]# sh file_check.sh /mnt/westos
/mnt/westos is 普通檔案 
[root@westoslinux mnt]# sh file_check.sh  /mnt/
/mnt/ is 目錄 

8.&& ||

&&	符合條件作動作
||	不符合條件作動作

補充:$的常見用法

連結: Linux中的$符號的三種常見用法.

相關文章