linux基礎指令基礎

常用命令

1
查看指令幫助:help

文件相關

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
查看當前目錄內容:ls、ll
清除終端內容:clear
進入下一級目錄:cd
創建文件:touch 1.txt
創建文件夾:mkdir 11
複製文件或文件夾:cp 被複制的文件 複製的路徑
查看當前路徑:pwd
看當前用戶所有歷史指令(~/.bash_history,注:系統退出後纔會保存):history
從歷史指令中找最後一條以xx開頭的指令並執行:!xx
強制刪除指定文件或文件夾:rm -rf 文件名
查看文件內容並顯示行號:cat -n 文件名 或 nl 文件名
統計文件行數:wc -l 文件名
查看文件前10行內容:head -10 文件名 
查看文件後10行並實時展示最增內容:tail -10 -f 文件名
分頁查看文件內容:more 文件名(下一頁:空格、上一頁:b)
分頁查詢並且搜索文件內容:less 文件名 (進入後按q退出,/加搜索內容並且高亮顯示)
比較兩個文檔不同:diff 文件1 文件2
爲路徑創建短連接:ls -s 路徑 短連接名(可以通過 cd 短連接名 直接進入對應路徑)
按100行分割一次,a表示分割後的文件名前綴,後綴是自動生成的:split -100 文件名 aaa
文件按固定大小分割:split -b 1M 文件名
文本合併,可以藉助cat:cat a* > a.txt

用戶相關

1
2
3
4
5
6
增加用戶:useradd 用戶名
設置密碼:passwd 用戶名
刪除用戶:userdel 用戶名
查看當前系統用戶:uname -a
給當前用戶文件增加讀寫執行權限:chmod  u+rwx 文件名 (u表示當前用戶,還有g(group)、o(others);如果省略,則表示給u、g、o均添加權限)
給所有用戶增加全部權限:chmod 777 文件名

系統相關

1
2
3
4
5
6
7
8
9
10
11
12
查看cpu、內存實時狀態:top
查看磁盤使用情況:df -h
查看內存使用情況:free -h
查看當前執行進程:ps -ef
查看網絡系統的狀態信息:netstat -a
強制終止指定某個進程:kill -9 pid
查看系統時間:date
查詢命令位置:which java
查看ip、網卡等信息:ifconfig
系統日誌的位置:/var/log/messages
向系統日誌寫消息:logger "xxxxx" 
安裝程序命令:yum、wget、rpm、apt-get...(有的適用於CentOS,有的RedHat,有的Ubuntu)

指令

1
2
3
4
5
6
7
8
9
輸出從2-10:seq 2 10
保存腳本執行結果並同時並查看:sh a.sh | tee b.txt
退出腳本:exit (正常退出返回0,異常退出返回非零)
爲指令設置別名:alias 1='df -h'(重啓終端還能使用別名需要將別名設置放到 ~/.bashrc文件中)
接觸別名:unalias 1
定時執行某腳本:crontab 1 * * * * ~/1.sh
(每小時1分的時候執行1.sh這個腳本)
查看當前用戶定時器設置:crontab -l
刪除當前用戶定時器設置:crontab -r

vim指令

插入模式

1
2
3
4
5
6
7
8
9
10
11
G:跳到文檔最後一行
gg:調到文檔第一行
x:刪除當前光標所在的字符
nx:從光標向後刪除n個字符
dd:刪除當前行
ndd:刪除當前及後n行
D:刪除當前行光標後邊所有字符
r:replace,替換當前光標的字符
yy:粘貼
p:paste複製
u:撤銷

命令行模式

1
2
3
4
5
6
7
i:從當前行進入插入模式
o:從下一行進入插入模式
q:退出vim模式
q!:退出並不保存更改內容
wq:退出並保持更改內容
/**:查詢字符串所在的位置,按下回車後用n進行搜索下一個,N返回上一個
nu:設置行號

打包/壓縮

1
2
3
4
5
6
7
8
9
打包當前目錄所有文件:tar -cvf a.tar * 
壓縮包:gzip a.tar
打包並壓縮當前文件夾內容:tar -czvf a.tar.gz  *  
解壓:tar -xvf a.tar
查看內部文件列表:tar -tf a.tar
解壓並解包:tar -zxvf a.tar.gz

zip壓縮:zip  target.zip  sourceFile
zip解壓到指定目錄:unzip  zipFile  -d  dir

Shell

解釋器

1
腳本開頭:#!/bin/bash 或 #!/bin/sh(默認可以不寫)

執行腳本

1
2
./shell.sh(需要執行權限)
sh shell.sh 或 bash shell.sh(讀取執行~只需要讀取權限)

變量

1
2
3
4
5
6
7
a=3:聲明變量a,並賦值3
$a:等價於${a}。但是 ${a}ook  和 $aook就不一樣
$?:上一個指令是否正確執行,上一個腳本是否正常退出(1-不正確,0-正確)
$0:文件名
$1~$9:第幾個參數值(echo ${1:-daily},取腳本第一個參數,如果沒有,則賦值daily)
$#:一共幾個參數
$*:所有入參

符號

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|:管道符號:把前邊的輸出作爲後邊的輸入
ls -s|sort -nr
>:覆蓋輸出;
echo  "abc"  >  a.txt
>>:拼接輸出;
echo  "abc"  >>  a.txt
;:一行執行多條語句的分隔符 
cat a.txt ;  ls
&&:前邊語句成功纔會執行後邊語句 
cat a.txt && ls
||:前邊語句失敗纔會執行後邊語句
lo || ls
$$:輸出當前腳本的執行進程id
echo $$
"":輸出變量值 
a=10;echo "$a"  ->  10
'':輸出本身 
a=10;echo '$a'  ->  $a
``:執行內部語法。
echo `date` 等價於 date
&>filename:把標準輸出和錯誤輸出都重定向到文件filename
sh abc.sh &> a.txt

read輸入

1
2
3
4
5
6
7
8
9
10
-t 阻塞時間
-s 隱藏輸入的字符
-p 給出提示符
-n 讀取字符的個數,個數到達臨界之後會自動執行

把接下來輸入的數據賦值給abc:
read abc
在10秒內最多輸入3個字符:
read -t 10 -n 3 -p '請輸入密碼:' pass
echo "密碼是:$pass"

計算器

1
2
3
4
5
6
7
8
9
整數:
    expr  10 + 20  #注意+號兩邊的空格
    echo $[10 + 20]
    echo $((10 + 20))
    echo $[10 % 3]  取餘
    echo $[10 \* 2] 乘法需要對*轉義
bc計算器:
    echo "scale=2;(1.2+2.3)/1" | bc  
    #把前邊的輸出作爲後邊的輸入,scale只對乘除有效所以需要/1(2;表示保留兩位小數)

條件判斷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[ -e a.txt ] :方括號必須有左右空格。
[ ! -e a.txt ] :感嘆號!表示取反
文件判斷:
    -e exist 文件是否存在
    -d directory 是不是目錄
    -f file 是不是文件
權限:
    -r 是否有讀權限
    -w 是否有寫權限
    -x 是否有執行權限
整數比較:
    -eq(equal)
    -ne (not equal)
    -gt (greater than)
    -lt (lesser than)
    -ge (greater or equal)
    -le (lesser or equal)
小數比較:藉助bc計算器
    bc判斷true返回1,false返回0
    [ `echo "1.2 > 1" | bc` -eq 1 ] && echo '大於'
字符串:
    直接用 = 或 != 進行判斷
    [ "1" = "1" ] && echo "相等"

if判斷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
格式1:
if [ 條件 ];then
    echo "xxx"
fi

格式2:
if [ 條件1 ];then
    echo "xxx"
elif [ 條件2 ];then
    echo "yyy"
else
    echo "zzz"
fi

#拓展:[]和[[]]的其中一點區別(雙括號要強大的多)
if [ $a -ne 1] && [ $a != 2 ]  
等價於: if [[ $a != 1 && $a != 2 ]] 
等價於: if [ $a -ne 1 -a $a != 2 ]      (其中-a是and,-o是or)

for循環

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
示例1:
    for i in 1 2 3 4 5
    do
        if [ $i -eq 2 ];then
            continue
        else
            echo "$i"
            sleep 1
        fi
    done

示例2:                
    for i in $(cat 1.txt)
    do
        ping -c 2 $i       
    done
    注:-c表示最多ping幾次。windows上是-n
示例3:((條件))
    for (( i=1;i<11;i++ ))   
    do
        echo $i
        sleep 1
    done
    注:i++相當於i=i+1,只能在(())中使用,等價於:let 'i+=1'

case選擇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo '請輸入城市:'
read city
case $city in
    '上海')
        echo '上海:35度'
    ;;
    '北京')
        echo '北京:20度'
    ;;
    *)
        echo '未知城市'
esac    #注:case倒敘        

示例2:case接受簡單正則
case $1 in
    [a-z]|[A-Z])
        echo "字母"
    ;;
    [0-9])
        echo "數字"
    ;;
esac

while循環

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
示例1:輸入數字,並求1到該數字的和
    sum=0
    i=0
    while [ $i -lt $1 ] 
    do
        sum=$(($sum+$i))
        i=$[$i+1]        
    done
    echo "從1加到$1的和是:$sum"
    
示例2:模擬菜單 
    while [ 1 ]      
    do
        cat <<EOF  #<<叫輸入重定向,EOF是隨便定義的(成對即可)
        1.執行1.sh
        2.執行2.sh
        q.退出
EOF  #末尾的EOF必須頂行寫,且前後均不能有空格或tab
     
        read -p '請選擇:' key
   
        case $key in
            1)
                clear
                echo '執行1.sh'
            ;;
        
            2)
                clear
                echo '執行2.sh'
            ;;
        
            q)
                clear
                echo '退出'
                break        
            ;;
        esac 
    done
    
示例3:
    num=0
    while [ $# -gt 0 ]
    do
        num=$(($1+num))
        echo "剩餘參數:$*"
        shift                #將參數向左偏移一個
    done
    echo "總和:$num"

    結果如下:
        [root@localhost xuan]# sh 5.sh 1 2 3 4 5
        剩餘參數:1 2 3 4 5
        剩餘參數:2 3 4 5
        剩餘參數:3 4 5
        剩餘參數:4 5
        剩餘參數:5
        總和:15

示例4:死循環
        while true   # 或  while :   或  while [ 1 ]
        do 
            let i++
            echo $i
            sleep 1
        done

函數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
示例1:兩數求和
function add(){
    echo $(($1+$2))
}
add 10 20

示例2:遍歷指定目錄下所有目錄
function listFiles() {
    for file in `ls $1`
    do
        dir=$1"/"$file
        if [ -d $dir ];then
            ls $dir
            listFiles $dir
        fi
    done
}
listFiles $1

字體顏色和特效

1
2
3
4
5
6
7
echo -e "\033[背景顏色;字體顏色;特效 \033[0m"
示例1:
echo -e "\033[32;41;5m 文本字體 \033[0m"            
#注:最後的0m表示關閉屬性,"\033["是固定前綴和後綴

示例2:
read -t 10 -p "`echo -e "\033[32;41;5m 請輸入密碼 \033[0m"`" pass

去重/排序

1
2
3
4
5
6
7
8
相鄰行去重:
cat a.txt | uniq     
相鄰行去重並統計次數:
cat a.txt | uniq -c
所有行排序,然後相鄰行去重並統計次數:
cat a.txt | sort | uniq -c 
-t:表示以:爲分隔符(默認空格),-k3表示以第3列排序(默認整行),-r表示反轉:
cat a.txt | sort -t: -k3 -r

文件搜索

1
2
3
4
5
6
7
8
9
10
11
12
簡單正則+通配符:
find . -name "a[0-9]*"
有的大寫,有的小寫:
find / -size 10c/10k/10M/10G    
d表示目錄,f表示文件,l表示鏈接:
find . -type d/f/l              
-mtime表示修改時間;-3表示3天以內,+3表示3天前:
find . -mtime -3/+3   
指定用戶:
find . -user root
xargs是將管道前的搜索作爲參數傳給後邊,此處如果不加xargs,則後邊的指令是沒有意義的:
find . -name "[a-b]*.sh" | xargs rm -rf

文本·行搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-v invert 反向選擇
-i ignore 忽略大小寫
-w word 單詞匹配
-n 顯示行號
"^xx" 某行以xx開頭(行首匹配)        
    grep "^user" a.txt  或:grep -E "^user" a.txt        
"xx$" 某行以xx結尾        
    grep "user$" a.txt
-E regex 正則    grep -E "sbi*" /etc/passwd
    grep -Ein "(linux){2}" a.txt        #注:()表示單元
    grep -Ein "(linux)+" a.txt
    grep -Ein "[0-9]+" a.txt
    grep -E "\*" a.txt        #注:\轉義等價於:grep "*" a.txt  (默認不支持正則)
    grep -E "[0-9]+\.+[0-9]+\.[0-9]+\.[0-9]+" a.txt    #注:搜索ip
    grep -E "^$" a.txt                #注:找空行
    grep -E "^[^d]" a.txt        
    #注:找不是d開頭的行。^放在[]外邊表示"以xx開頭",放在[]中表示"除了"

文本·列操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-d 指定分隔符,delimiter
-f 指定第幾列
-c 按字符截取

示例1:以冒號分割後,取第1列和第3列
    cut -d ':' -f 1,3 /etc/passwd        
    #注:1,3表示第1列和第3列;1-3表示第1列到第3列;3-表示第3列以後。

示例2:
    cut -c 1-4 /etc/passwd        #截取第1列到第4列字符,以字符爲單位

示例3:查找linux系統中所有不能登錄的用戶名
    cat /etc/passwd | grep /sbin/nologin | cut -d ':' -f 1

    #注1: cat /etc/passwd | cut -d ':' -f 1 等價於cut -d ':' -f 1 /etc/passwd
    #注2:/bin/bash結尾的用戶是可以登錄的;/sbin/nologin結尾的是系統默認用戶,不可以登錄
    #注3:cut用空格分割的話,每一個空格都會計數1次。
    Mem:    1837    107     298     0     1431    1532
    free -m | grep -i mem | cut -d " " -f 12       ->  1837
    free -m | grep -i mem | cut -d " " -f 2        ->  空格

文本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
awk是一門語言,是3個創始人的姓名首字母縮寫而成
printf不換行打印;print 換行打印      
        printf '%3s %3s\n' 11 12        ->        %ns是字符串,n默認是1可省略
        printf '%2i %2i\n' 11 12        ->        %ni是數字
        printf '%.2f\n' 0.1234          -> 0.12   "%.nf"是格式化浮點數

3.1 awk (默認分隔符是空格)
3.2 awk '條件1 {動作1} 條件2 {動作2}' 文件名        
    echo "0.123+0.123" | bc | awk '{printf "%.2f\n", $0}'  
    #注:$0表示整行,$1表示第一列...
    df -h | grep /dev/sda2 | awk '{print "sda2的磁盤使用率:" $3}'
    free -m | sed -n '2p' | awk '{print "total:"$2"\n" "userd:"$3"\n"}'

3.3 awk 選項 '條件1 {動作1} 條件2 {動作2}' 文件名        
    cat /etc/passwd | awk -F ":" '{printf $1}'  
    #注:-F指定分隔符,field-separator
    cat /etc/passwd | awk 'BEGIN {FS=":"}{print $1} END {print "結束了"}'
    #注1:FS是field separator
    #注2:BEGIN是在awk之前執行,一般用於修改內置變量;END是awk執行完之後執行

3.4 NR 行號,是awk中的一個常量(num row);NF列號(num field)
    df -h | awk 'NR==2 {print $1}'
    df -h | awk '(NR>=2 && NR <=4) {printf $1"\n"}'
    cat a.txt | awk 'END{print NR}'     #統計有多少行
    cat a.txt | awk '{if(NR==1){print $0}}'    #打印第一行
    cat a.txt | awk '$0~/java/'   #$0表示整行,~表示匹配,/被匹配文本/
    cat a.txt | awk '$0!~/java/'   # !~表示不匹配

文本·行操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-n和p一塊使用: df -h | sed -n '2'p  #查詢第2行,p表示print,也可以寫成sed -n '2p'
d:刪除        df -f | sed '2'd     #刪除第2行

eg:
  cat a.txt | sed -n '1,/java/'p   #搜索第1行到包含java的那一行。
  cat a.txt | sed -n '10,$'p  #搜索第10行到最後一行。等價於:sed -n '10,$'p a.txt
  cat a.txt | sed '2,3'd      #搜索除了第2行到第3行的數據

a:在下邊插入        
    df -h | sed '2a xuan'
i:在上邊插入
    df -h | sed '2i xuan'
c:替換        
    df -h | sed '2c xuan'        #把第2行替換成xuan
s/舊串/新串/g        
    df -h | sed 's/oldStr/newStr/g'
-i:對源文件進行修改(危險)        
    sed -i 's/oldStr/newStr/g' a.txt 
    sed -i '2i 玄' 5.txt
-e:指定多個條件

簡單例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1.判斷兩個數是否相等
    if [ $1 -eq $2 ];then   注:if後有空格
        echo "$1等於$2"
    else
        echo "$1不等於$2"
    fi
        
    等價於:
        [ $1 -eq $2 ] && echo "$1等於$2"
        [ $1 -eq $2 ] && echo "$1不等於$2"
        #注:多條件
        if [ "a" = "a" ] && [ "b" = "b" ]

2.判斷上一個指令是否執行成功
    fName=22.txt
    touch $fName
    if [ $? -eq 0 ];then
        echo "$fName創建成功"
    fi

3.判斷輸入的數字是否大於10
    echo '請輸入一個數字:'
    read number
    if [ $number -eq 10 ];then
        echo '等於10'
    elif [ $number -lt 10 ];then
        echo '小於10'
    else
        echo '大於10'
    fi
    
4.越過交互:給用戶xuan設置密碼。需要交互兩次
    方式1:
        passwd xuan < password.txt                        
        #注:password.txt文件中有兩行相同的密碼
    方式2:
        passwd xuan <<EOF     #注:<<前是指令。heredoc語法 
        123
        123
        EOF        #注:末尾的EOF必須頂行寫,不能有空格或tab
        
        sh a.sh <<EOF
        土豆
        root
        EOF
            
    方式3:
        echo 123 | passwd --stdin xuan                
        #注:passwd的--stdin參數ubuntu不支持,centos纔可以

巡檢內存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
total=`free -m | sed -n '2p' | awk '{printf $2}'`   
#注:awk '{}'別漏了單引號;printf別漏了f
used=`free -m | grep -i mem | awk '{printf $3}'`
percent_used=`echo "scale=2;$used/$total" | bc | awk '{printf "%.2f",$1}'`
echo -e "總共:${total}m"
echo "已用:${used}m"
echo "內存使用率:$percent_used"

threshold=0.04
flag=`echo "$percent_used > $threshold" | bc`
if [ $flag -eq 1 ];then
    echo -e "\033[31m內存使用率超過$threshold \033[0m"     
    #注:31m後邊如果有空格,則打印出來也有
fi

批量創建用戶

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
read -p '請輸入用戶名前綴:' user
read -p '請輸入創建用戶個數:' num
echo "$user $num"
for i in `seq 1 $num`    #注:seq默認從1開始,所以1可以省略
do
    #創建用戶:先判斷用戶是否存在
    newUser=$user$i
    cat /etc/passwd | awk -F":" '{printf $1"\n"}' | grep $newUser
    if [ $? -eq 1 ];then    #注:上邊搜不到則$?=1
        useradd $newUser
        echo "創建用戶$user$i"
 #設置8位隨機密碼. /dev/urandom文件中會隨機產生一些亂碼數據,使用md5sum可以得到隨機字符串
        password=`head -1 /dev/urandom | md5sum | cut -c 1-8`   
        echo "用戶名:$newUser\t密碼:$password" >> user_passwd.txt
    fi
done

從mysql查詢數據

1
2
3
4
5
read -p '請輸入你要查詢的商品名稱:' name
read -p '請輸入數據庫用戶名:' username

/usr/bin/mysql -u${username} -p -e "use test;select * from item where name = '$name';"
#注:-e表示excute,不進入mysql命令窗口,直接執行語句

高效登錄遠程服務器

1
2
3
4
5
ip=`cat ip.txt | grep $1  | awk '{printf $2}'`
ssh $ip

執行:
sh aaa.sh beijing       #注:beijing賦值給$1,ip.txt文件中地址和ip使用空格隔開

最後推薦大家一個常用搜索Linux命名的網站:https://man.linuxde.net/,可以查看Linux命令的選項參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章