SHELL腳本

Shell腳本


腳本:可以執行文件,運行後可以實現某種功能(命令的堆積,非交互)


在Linux系統中腳本的解釋程序基本都在/bin/bash下面


在Linux系統中利用Bash的有點:可以使用快捷鍵、支持Tab鍵補齊、可以運用歷史命令、製作別名、支持標準輸入輸出、(在Shell腳本中經常使用重定向和管道操作)


重定向:

           (1)重定向輸入 :<------------將(<)後面的內容導入到前面的文件中

             (2)  重定向輸出 :>-------覆蓋重定向;>>---------追加重定向

                                       >:只收集前面命令的正確輸出

                                       2>:只收集前面命令的錯誤輸出

                                       &>:收集前面命令的錯誤與正確輸出 





Shell中的一些數值運算:expr 2 + 2、X=100 expr $X + 10

                    X=66  echo $[X+5]

for循環的結構

for 變量名 in 值列表

do

    命令

done


While 判斷條件

do

    命令

done


case 變量名 in

模式)

       命令;;

模式)

       命令;;

模式)

       命令;;

*)

    默認的命令;;

esac



子串截取的三種用法:

${x:起始位置:長度}

expr substr "$x" 起始位置 長度

echo $x | cut -b 起始位置-結束位置


字符串的替換

“/” 代表替換,vim中也是一樣“/“代表替換

echo ${變量//舊的內容/新的內容

舉列:x=1332551445

     echo ${x//5/*}

     echo ${x/335/***



變量“:” 截取,“/” 替換,“#" 掐頭,”%“,去尾


字符串掐頭去尾:

從左向右,最短匹配刪除:${變量名#*關鍵詞}

從左向右,最長匹配刪除:${變量名##*關鍵詞}

從右向左,最短匹配刪除:${變量名%關鍵詞*}

從右向左,最長匹配刪除:${變量名%%關鍵詞*}

 x=`head -1 /etc/passwd`

root:x:0:0:root:/root:/bin/bash

echo ${x##:}

echo ${x##*:}

echo ${x%%:*}


遠程控制連接

i=192.168.4.207

expect << EOF

set timeout 300

spawn ssh $i  

expect yes     { send "yes\n"}

expect passwd { send "123456\n"}

expect #      { send "touch /qq\n"}

expect #      { sned "exit\n"}

EOF

(1)有時有yes提示,有時沒有,刪除known_hosts

(2)ssh比較慢,可以把ssh變快(修改配置文件),讓expect多等會

(3)expect最後一條命令不執行


在shell腳本中一步步顯示腳本的執行命令是:bash -x 腳本名字

seq 3----1、2、3

seq 2-6----2、3...6

echo -e -n "\033[33m \033[0m"-----“-e”代表擴展想要把這個顏色填充完整,“-n”表示不換行

3X------是字體顏色

4X------是背景顏色

X-------表示樣式


正則表達式:使用一些特殊的符號來表達

“^”---------------表示開始

“$”---------------結尾,行尾

“[ ]”--------------表示集合中任意符號

列如[a-e]=[abcde],[abcdemz123]=[ma-ez1-3]


[^]------------表示對集合取反

“.”-----------任意單個字符

“*”-----------匹配前一個字符出現了任意次(0次或多次)

“.*”----------匹配所有

\{n,m\}-------匹配前一個字符出現了n到m次

\{n,\}--------匹配前一個字符出現了n次或更多

\{n\}---------匹配前一個字符出現了n次

grep -n-------顯示行號

grep -i-------不去分大小寫

grep -c-------統計過濾出有幾行

grep -v-------表示取反


擴展正則:優化基本正則,添加新的

{n,m}、{n,}、{n}

“?”------0或1次

“+“------1或大於1次 

“( )”------表示整體,列如:(abc){8}---------表示abc出現了8次

列如:

vim brace.txt

ab def ghi abdr

dedef abab ghighi

abcab CD-ROM

TARENA IT GROUP

cdcd ababab

Hello abababab World

[1]輸出ababab的行,即“ab”連續出現3次

egrep '(ab)'{3} brace.txt

[2]輸出ab,連續出現2~4次

egrep '(ab){2,4}' brace.txt

[3]輸出ab,至少連續出現3次

egrep '(ab){3,}' brace.txt

元字符[ ]-------匹配範圍內的單個字符

輸出包括abc、abd的行,即前兩個字符爲“ab”,第三個字符只要是c、d中的一個就符合條件:

egrep 'ab[cd]' brace.txt

輸出包括大寫字母的行,使用[A-Z]匹配連續範圍:

egrep '[A-Z]' brace.txt

輸出包括“非空格也非小寫字母”的其他字符的行,本例中大寫字母和 – 符合要求:

egrep '[^ a-zA-Z]' brace.txt


“|”--------表示或者關係,列如:(test|taste)

基本正則:兼容性強,使用麻煩

擴展正則:兼容性差,使用簡單,有些軟件不支持擴展正則

egrep---------支持擴展正則

\b------------表示單詞邊界


sed:文本編輯器,非交互(增、刪、改、查)

sed    [選項]    '條件指令'      文件

sed:逐行處理文件,流水處理

指令:p--打印

     d--刪除

     s--替換,s/舊的/新的/--------------注意:替換符號可以是任意其他符號

     a--追加

     i--插入

     c--替換,整行替換

sed -n '|op' /etc/passwd-------(-n)屏蔽sed默認輸出功能

    -r---支持擴展正則

sed使用的一些條件:(1):行號: sed -n '3p' /etc/passwd----把第三行打印出來

                          sed -n '3,5p' /etc/passwd---打印3、4、5行

                               (2):/正則/:sed -n '/root/p' /etc/passwd---把包含root的都打印出來

sed -n '/bash$/s#:.*##p' /etc/passwd-----把以bash結尾的行中的用戶找出來,s替換

awk -F: '/bash$/{print $1}' /etc/passwd


awk:數據過濾,統計處理(行,列),也是逐行處理

awk  [選項]  '條件{指令}'   文件

df | awk '/\/$/{print $4}'---------df:查看硬盤

free | awk '/Mem/{print $4}'------free:查看內存

選項:-F----指定分隔符(默認是空格或tab)

awk -F: '{print $1}' /etc/passwd

awk的一些內置變量:$1,$2,$3(表示某一列)、NF(當前行有多少列)、NR(當前行號)

awk打印常量(常量必須要使用引號)

列如:awk '{print "nh","root","nb"}' /etc/passwd

          awk -F: '{print "用戶是:",$1}' /etc/passwd

awk的完整命令:

            awk [選項] 'BEGIN{}  條件{ }   END{}' 條件--------所有指令必須放在{ }

            BEGIN{}:指令在讀取文件內容前執行1次

                      條件{ }:指令在讀取文件中執行n次

            END{}:指令在讀取文件後執行1次

awk -F: 'BEDIN{print "用戶名"  "UID" "解釋器"}  {print $1,$2,$3}  {print "總用戶量" NR}' /etc/passwd

awk的條件:

                (1)正則(也可支持模糊匹配)

                 列如:一整行中包含root即可

         awk -F: '/root/{print $3}' /etc/passwd

                          在一列中包含root即可

         awk -F: '$1~/root/{print $3}' /etc/passwd

                (2)數字和字符比較:==;!=;>;>=;<;<=

         awk -F: '$3>=1000{print $1}' /etc/passwd

         awk -F: '$1=="root"' /etc/passwd

                (3)邏輯:&&;||

         awk -F: '$3>10&&$<20' /etc/passwd

         awk -F: '$3==0||$3==1000' /etc/passwd

(4)運算

awk 'BEGIN{x=5;y=5;print x+y}'

awk 'BEGIN{pirnt 2.5*5}'

awk 'BEGIN{x=5;print x+y}'

統計普通用戶有幾個,系統用戶幾個

awk -F: '{if($3<1000){x++}else{y++}} END{print x,y}' /etc/passwd

列子:

    vim a.txt

    root haha root

    hehe root

    ni   hao  ma  root

awk '{i=1;while(i<=NF){if($i=="root"){x++};i++}}END{print x}' a.txt




sed -i '/192.168.4.5/d' ~/.ssh/known_hosts


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