天天看點

shell基本用法介紹

一、1、基礎正規表達式:

         *         前一個字元比對0次或任意多次

         .         比對除了換行符外任意一個字元

         ^         比對行首,例:^Hello,比對以Hello開頭的行

         $         比對行尾,例:Hello$比對以Hello結尾的行

         []        中括号中指定的一個字元,例:[0-9]、[a-z]

         [^]       比對中括号字元以外的任意一個字元,例:[^0-9]、[^a-z]

         \         轉義符,取消特殊符号的含義

         \{n\}     表示其前面的字元恰好出現n次,例:[0-9]\{4\}、手機号[1][3-8][0-9]\{9\}

         \{n,\}    表示其前面的字元出現不小于n次,例:[0-9]\{2,\}表示2位以上的數字

         \{n,m\}   表示其前面的字元至少出現n次,最多出現m次,例:[a-z]\{6,8\}表示6到8位小寫字母

         2、擴充正規表達式:#grep–E 或 egrep

         +        前一個字元比對1次或任意多次

         ?       前一個字元出現0次或1次,例:colou?r比對colour和color

         |        比對兩個或多個分支選擇,例:was|his,比對包含was的行,也包含his的行

         ()       比對其整體為一個字元,即模式單元,可了解為由多個單個字元組成的大字元,例:(dog)會出現dog,dogdog,dogdogdog等;hello(world|earth),比對hello worlda或hello earth

注:grep、awk、sed等指令支援正規表達式;ls、find、cp支援shell通配符

         3、#grep “a*”          t.txt          (比對任何内容

         #grep“aa*” t.txt     (比對至少包含一個a的行

         #grep“aaa*” t.txt    (比對至少包含二個a 的行

         #grep“s..d” t.txt    (比對s和d之間一定有2個字元的單詞

         #grep“s.*d” t.txt    (比對s和d之間有任意個字元

         #grep“^M” t.txt      (比對以M開頭的行

         #grep“N$” t.txt      (比對以N結尾的行

         #grep“^$” t.txt      (比對空白行

         #grep“^….$” t.txt   (比對四個字元的行

         #grep“[0-9]” t.txt   (比對含數字的行

         #grep“^[a-z]” t.txt  (字母開頭的行

         #grep“[^A-Z]” t.txt  (非大寫字母的行

         #grep“\.$” t.txt     (以點結尾的行

         #grep“a\{3\}” t.txt  (三個連續a的行

         #grep“[0-9]\{3,\} t.txt     (至少三個數字開頭的行

         #grep“[su]a\{3,\}[iI] t.txt (s或u和i或I之間至少有三個連續的a

         #grep“sa\{1,3\}i” t.txt    (s和i之間最少有1個a最多有3個a

二、字元截取和替換指令

         1、#cut 選項 檔案名

         -f列号                fields提取第幾列

         -d“分隔符”          delimiter指定分隔符

         -c字元範圍            通過字元範圍進行字段提取,行首為0;“n-”表示從第n個字元到行尾;“n-m”表示從第n個字元到第m個字元;“-m”表示從第1個字元到第m個字元

         例:#cut –f 2s.txt

         #cut–f 2,3 s.txt

         #cut–c 8- s.txt

         #cut–d “:” –f 1,3 s.txt

         2、awk程式設計

         >#printf ’輸出類型輸出格式’  輸出内容

         輸出類型:

     %ns          輸出字元串,n指代輸出幾個字元

         %ni         輸出整數,n指代輸出幾個數字

         %m.nf       輸出浮點數,m代表總數位,n是小數位。例:%8.2f表示6位整數,2位小數

         例:#printf ‘%s’$(cat s.txt)

         #printf‘%s\t%s\t%s\t%s\t \n’ $(cat s.txt)

         #printf‘%i\t%s\t%i\t%8.2f \n’ $(cat s.txt) | grep –v Name

awk ‘條件1{動作1} 條件2{動作2}……’ 檔案名

動作:格式化輸出,流程控制語句

         注:在awk程式設計中因指令語句長,輸入格式時需注意:

         》多個條件{動作}可用空格分割也可用回車分割;

         》在一個動作中,如果需要執行多個指令,要用分号分割或用回車分割;

         》變量的指派與調用都不用加$符号;

         》條件判斷兩個值是否相同使用==,不要和變量指派混淆。

         例:#awk ‘{printf$2 “\t” $6 “\t” “\n” }’ s.txt    (printf輸出時在輸出格式的最後要加“\n”,而print則不用。

         #df–h | awk ‘{print $2 “\t” $6}’ s.txt      

         #cats.txt | grep –v Name | awk ‘$6 >= 87 {print $2}’    (加入條件後,隻有條件成立動作才執行

         #awk‘BEGIN {print “this is a transcript”}  {print $2 “\t” $6}’ s.txt       (awk隻要檢測不到完整的‘’就不會執行,是以不用加換行符;BEGIN在讀取資料前僅執行一次

         #awk‘END {print “The end!”} {print $2 “\t” $3}’ s.txt   

         #awk‘$2 ~ /sb/ {print $6}’ s.txt       (第二個字段包含有sb則列印第六字段

         #awk‘/sd/ {print}’ s.txt               (列印sd的成績

         #df–h | awk ‘/sda[0-9]/ {print $1 “\t” $5}’

         #cat/etc/passwd | grep “/bin/bash” | awk ‘BEGIN{FS=”:”} {print $1 “\t” $3}’

         #cat/etc/passwd | grep “/bin/bash” | awk ‘BEGIN{FS=”:”} {print $1 “\t” $3 “\t 行号:”\

>NR “\t 字段數: “ NF}’        (NR總資料的第幾行,NF總字段數

         注:awk是列提取指令,但也要按行來讀入,執行過程:

         》如有BEGIN,則先執行BEGIN定義的動作;

         》讀入第一行,第一行的資料依次賦予$0,$1,$2等變量,$0代表此行的整體資料,$1代表第一個字段,$2代表第二個字段;

         》依據條件判斷動作是否執行,符合執行,否則讀入下一行資料,若沒條件,則每行都執行動作

         》讀入下一行資料,重複以下步驟。

         #awk‘NR==2 {php1=$3}

         NR==3{php2=$3}

         NR==4{PHP=$3;total=php1+php2+php3;print”total php is ” total}’ s.txt

         #awk‘NR>=2 {test=$4}

         test>90{print $2 “is a good man!”}’ s.txt

         function函數名 (參數清單){

         函數體

         }

      #awk ‘functiontest(a,b) {print a “\t” b}

         {test($2,$6)}’ s.txt

         #vipass.awk

         BEGIN‘{FS=”:”}

         {print$1 “\t” $3}

         #awk–f pass.awk /etc/passwd

         3、sed(streameditor,對文本檔案和标準輸入進行編輯,鍵盤輸入、檔案重定向、字元串、變量、來自管道的文本

         #sed選項 ‘動作’檔案名

         -n      有此項,輸出時隻會顯示sed處理的行

         -e      對輸入資料應用多條sed指令編輯

         -f腳本檔案     與#awk –f類似

         -r      支援正規表達式

         -I      直接修改源檔案中資料,而不是由螢幕輸出

         動作:

         a\     append追加,在目前行後添加一行或多行,每行末尾用\代表資料未完,最後一行不用

         c\     行替換,用c後面的字元串替換原資料行,多行時用\代表資料未完,最後一行除外

         i\     insert在目前行前插入一行或多行,多行時每行末尾用\代表資料未完,最後一行除外

         d      删除指定的行

         p      列印輸出指定的行

         s      字元替換,格式:行範圍s/舊字串/新字串/g

         行資料操作:例子:

         #sed–n ‘2p’ s.txt

         #sed‘2,4d’ s.txt

         #sed‘2a hello’ s.txt

         #sed‘2i hello \

         >world’s.txt    (行末用\代表資料未完,在第二行前插入兩行資料

         #sed–n ‘2i’ hello \

         >world’s.txt    (僅顯示處理的行

         #cats.txt |sed ‘2c No such person’ (将第二行替換

         #sed–i ‘2c No such a person’ s.txt(直接處理檔案資料,-i謹慎使用

         字串替換:例子:

         #sed‘s/舊/新/g’ s.txt

         #sed‘3s/74/99/g’ s.txt

         #sed‘4s/^/#/g’ s.txt

         #sed–e ‘s/sb//g ; s/sd//g’ s.txt

三、字元處理指令

         》#sort 選項 檔案名

         -f      忽略大小寫ignore-case(foldlower case to upper case characters)

         -b      忽略每行前面的空白部分ignoreleading blanks

         -n      以數值排序numeric-sort

         -r      反射排序reverse

         -u      排除重複行,同uniqu指令

         -t      指定分隔符,預設是制表符

         -kn[,m]    按指定的字串範圍,從n字段開始,m字段結束(預設到行尾)

         例:#sort/etc/passwd

         #sort–r /etc/passwd

         #sort–t “:” –k 3,3 /etc/passwd       (隻用第3字段排序

         #sort–n –t “:” –k 3,3 /etc/passwd

         》#uniq 選項 檔案名    (-i 忽略大小寫

         》#wc 選項 檔案名      (-l,line;-w,word;-m字元數

四、條件判斷

         1、檔案類型判斷:

         例:#[  -e /root/sh/  ]

         #echo$?

         #[ -d /root/sh  ] && echo “yes”|| echo “no”

         2、檔案權限判斷:

         #[  -w s.txt  ]&& echo “yes” ||echo “no”

         3、兩個檔案之間進行比較:

         #[ /root/s.txt -ef  /tmp/sut.txt ] && echo “yes”|| echo "no”                         (判斷是否硬連結

         4、兩個整數之間比較:

         #[  23  -ge  22  ]&& echo “yes” || echo “no”

         5、字元串的判斷:

         #[  -z  “$name”  ] && echo “yes” || echo “no”

         6、多重條件判斷:

         #[  -n  “$aa”  -a -n  “$aa”  -gt  23] && echo “yes” || echo “no”

五、流程控制:

         1、if條件判斷:

         》單分支:

         if[  條件判斷式  ];then

             程式

         fi

         或

         if[  條件判斷式  ]

         then

             程式

         注:使用fi結尾,和一般語言使用大括号不同;條件判斷式使用test指令判斷,中括号和條件判斷式之間必須有空格;then扣是符合條件之後執行的程式,then可放在[]之後用分号分隔,也可換行寫入不寫分号

         例:#vi  fi1.sh

         #!/bin/bash

         rate=$(df–h | grep “/dev/sda3” | awk ‘{print $5}’ | cut –d “%” –f 1)

         if[  “$rate”  -ge 80  ]

             echo“Warning! /dev/sda3 is full!”

         》雙分支

         if  [  條件判斷式  ]

                then

                   條件成立時執行的程式

                else 

                   條件不成立時執行的程式

         例:#vi  backmysql.sh

         ntpdateasia.pool.ntp.org &>/dev/null

         date=$(date+%Y%m%d)

         size=$(du–sh /var/lib/mysql)

         if[  -d /tmp/dbbak  ]

                then

                  echo“Date: $date!” > /tmp/dbbak/dbinfo.txt

                  cd/tmp/dbbak

                  tar–zcf  mysql-lib-$date.tar.gz  /var/lib/mysql  dbinfo.txt &>/dev/null

                  rm–rf  /tmp/dbbak/dbinfo.txt

                else

                   mkdir/tmp/dbbak

                   echo“Date: $date!” > /tmp/dbbak/dbinfo.txt

                   echo“Date size: $size” >> /tmp/dbbak/dbinfo.txt

                   cd  /tmp/dbbak

                   tar–zcf  mysql-lib-$date.tar/gz  /var/lib/mysql  &>/dev/null

                   rm–rf /tmp/dbbak/dbinfo.txt

         例:vi  autostart.sh

         port=$(nmap–sT 192.168.4.210 | grep tcp | grep http| awk ‘{print $2}’)

         if  [  “$port”  ==  “open”  ]

                   then

                       echo“$(date) httpd is OK!” >> /tmp/autostart-acc.log

                   else

                       /etc/rc.d/init.d/httpdstop       &>/dev/null

                       /etc/rc.d/init.d/httpdstart    &>/dev/null

                       echo“$(date) restart httpd!” >> /tmp/autostart-err.log

         》多分支

                      當條件判斷式1成立時,執行程式1

         elif  [  條件判斷式  ]

                      當條件判斷式2成立時,執行程式2

         ……

         else

                     當所有條件都不成立時,執行此程式

         例:#vi  if-elif.sh

         read–p “please input a filename:  “ file

         if  [ -z  “$file”  ]

                            echo“Error,please input a filename.”

         elif  [  ! –e “$file” ]

                            echo“Your input is not a file”

         elif  [ -f  “$file”  ]

                            echo“$file is a regulaar file.”

         elif  [ -d  “$file”  ]

                            echo“$file is a directory!”

                            echo“$file is an other file!”

         2、多分去case條件語句:case隻判斷一種條件關系,而if可判斷多種條件關系。

         case$變量名 in

                   “值1”)

                   如果變量的值等于值1,則執行程式1

                   ;;

                   “值2”)

                   如果變量的值等于值2,則執行程式2

                   *)

                   如果變量的值都不是以上的值,執行此程式

         esac

         注:case語句會取出變量中的值,與語句體中的值逐一比較,符合則執行相應程式,不符依次比較下一個值。若所有值都不符合,則執行*)後的程式,*代表所有其它值;以case開頭,esac結尾;每個分支之後要用;;結尾,代表該程式段結束。

         例:#vi case.sh

         read–p  “please chose yes/no: “ cho

         case$cho in

                   “yes”)

                   echo“Your choose is yes!”

                   ;;

                   “no”)

                   echo“Your choose is no”

                   *)

                   echo“Your choose is error!”

         3、for循環是固定循環,在循環時已知道要循環幾次,也稱計數循環

         for  變量  in  值1  值2  值3

                   do

                            程式

                   done

         注:in後有幾個值就循環幾次,每次循環都把值賦予變量

         for  ((初始值;循環控制條件;變量變化))

                  do

         注:初始值,在循環開始時需要給變量賦予初始值,如i=1;循環控制條件,用于指定循環的次數,如i<=100;每次循環之後,變量該如何變化,如i=i+1,每次循環之後變量都加1.

         例:vi  auto-tar.sh

         cd  /bin/bash

         cd  /lamp

         ls  *.tar.gz > ls.log

         for  i  in $(cat ls.log)

                     tar  -zxf $i  &>/dev/null

         rm–rf /lamp/ls.log

         例:#vi  useradd.sh

         read  -t 30 -p “Please input username: “ name

         read  -t 30 -p “please input the number of users: “ num

         read  -t 30 -p “please input the password: “ pass

         if  [ -n  “$name” –a  -n  “$num”  -a -n  “$pass”  ]

              then

                 y=$(echo  $num | sed ‘s/[0-9]//g’)

                   if  [  -z  “$y”  ]

                      then

                         for  ((i=1;i<=$num;i=i+1))

                             do

                              /usr/sbin/useradd  $name$i &>/dev/null

                              echo  $pass | /usr/bin/passwd --stdin $name$i  &>/dev/null

                             done

                   fi

         4、while循環:隻要條件判斷式成立,循環就一直繼續,直到條件不成立才停止。

         while[  條件判斷式 ]

                       程式

         5、until循環:條件判斷式不成立則進行循環,條件成立,則中止循環。

         until[  條件判斷式  ]

         6、函數:

         function  函數名 () {

                   程式

         7、特殊流程控制語句:

         》exit語句:在腳本中是退出目前腳本,#exit 傳回值,傳回值可自己定義,用$?查詢,若沒定義傳回值,則是執行exit語句之前最後執行的指令的傳回值。        

         》break語句會結束整個目前循環,而continue語句結束單次目前循環,下次循環會繼續

         for  ((條件判斷語句))

                       程式語句

                       break(continue)

         例:#vi  ping.sh

         #/bin/bash

         echo “這個腳本是統計/root/ip.txt所有ip位址的丢包率”

         for  i $(cat  /root/ip.txt)

                            aa=$(ping  -c 3 $i | grep ttl | wc  -l)

                            bb=$((  3 - $aa ))

                            cc=$(echo  “$bb 3” | awk ‘{ print “%5.2f% \n”,$1/$2*100}’)

                            echo “$i的丢包率是:$cc”

本文轉自激情燃燒的歲月部落格51CTO部落格,原文連結http://blog.51cto.com/liuzhengwei521/1736162如需轉載請自行聯系原作者

weilovepan520