shell腳本及正則表達式

shell腳本的編寫及正則表達式:

    一、shell腳本的基本:

   1.首先shell腳本到底是什麼?

        1)純文本文檔--文件中所存儲的數據都是以字符爲單位進行存儲的;

        2)根據用戶的需求來解決用戶問題的大量命令的組合體

        3)“執行冪等性”——任何命令多次執行的結果是一致的

             注意:很多命令都不具備“執行冪等性”,在shell腳本中就需要大量的程序邏輯來判斷某個命令是否滿足其運行條件,以避免在運行過程中出現嚴重錯誤。

   

   2.腳本的基本代碼內容:

       1)首先我們可以利用文本編輯工具來編寫shell腳本:

              例如:Nano 、vi、Vim、emacs、pico

           在這裏我們推薦使用Vim,因爲它具有語法着色,自動縮進等特性


        腳本的命令方式:可以使用.sh的文件名爲後綴;在低版本的Vim編輯器,只能根據.sh的後綴命令來識別是否爲shell腳本,高版本的Vim編輯器,則無需過多的文件後綴名的問題;

      

       2)shebang:首行必須是shebang,解釋器路徑,必須佔據就對行首:在執行時,啓動相應的解釋器以解釋腳本內諸多的命令

         因爲我們使用的shell爲bash

          #! /bin/bash

       3) 在shell腳本中,除了shebang之外,所有以#開頭的行都爲註釋行,解釋器都會忽略這樣的行的內容

    例如:

         # author:秦耀東

         # type:基礎練習

         ...

      4)空白行:解釋器會忽略腳本中所有的空白行;

      5)大量的關鍵字和命令:if、else、then、do、while、for、...

      6) bash中所有的特殊想字符

 /// 注意:shell腳本一旦運行,是在當前的shell中根據shebang的指示,開啓一個解釋器(子shell)解釋執行代碼內容,shell腳本的內容是在一個子shell進程中實現的;

      

    3.腳本的運行方法:

       1)爲腳本文件賦予執行權限,直接運行此文件:

         ~ ]#  chmod  +x /PATH/TO/SCRIPT_FILE

          注意:如果在執行腳本時,只寫腳本的名不寫路徑的話,必須確保PATH變量中保存的路徑下,能夠找到該文件;

       2)直接使用解釋器運行腳本,講腳本作爲解釋器命令的參數;

            bash /PATH/TO/SCRIPT_FILE

            bash -x /PATH/TO/SCRIPT_FILE(將腳本的運行過程展示出來,一般用於腳本排錯)

            bash -n /PATH/TO/SCRIPT_FILE(對腳本進行語法排錯,如果存在語法錯誤,則 bash會給予提示,針對於這類錯誤提示,,需要我們自行判斷錯誤的發生位置)



  二、正則表達式:

  

在學習正則表達式之前我們先來學習文本處理工具:

文本處理三劍客:

grep系:grep、egrep、fgrep,文本搜索工具,基於"PATTERN"對於給定的文本進行模糊搜索,grep系默認工作於貪婪模式下;


sed:Stream EDitor,流編輯器,行編輯器,文本編輯工具;


awk:gawk——GNU awk,文本格式化工具,文本報告生成器,文本處理的編程語言;


  1.grep系:grep  egrep  fgrep

     

     1:grep:默認僅支持基本正則表達式

       全稱爲Global search Regular Expression and Print out the line.利用正則表達式進行全局搜索並將匹配的行顯示出來;

       1)grep [OPTIONS] PATTERN [FILE...]

          ////這裏我們要介紹一下PATTERN,PATTERN是一種過濾條件,是由正則表達式元字符以及沒有特殊含義的文本字符組成;

            正則表達式的元字符會被正則表達式引擎解釋爲特殊含義;

            正則表達式的文本字符是指只具備字符表面含義的字符;

       常用選項爲:

        -i, --ignore-case:忽略文本字符的大小寫;

        -v, --invert-match:反向匹配;最終顯示的結果是PATTERN不能成功匹配的行;

        -c, --count:計數,統計匹配PATTERN的所有的行數;

       -o, --only-matching:關閉貪婪模式,僅顯示PATTERN能夠匹配的內容;

        -q, --quiet, --silent:安靜模式,不輸出任何匹配結果;

       --color[=WHEN], --colour[=WHEN]:將匹配PATTERN的內容以特殊顏色高亮顯示;

    --color=auto

       -E, --extended-regexp:擴展的正則表達式,grep -E相當於egrep;

        -F, --fixed-strings, --fixed-regexp:grep -F相當於fgrep

        -G, --basic-regexp:基本的正則表達式,egrep -G相當於grep

        -P, --perl-regexp:使用PCRE(Perl Common Regular Expression)引擎;

       -A NUM, --after-context=NUM:在顯示匹配PATTERN的行的同時顯示其後面的NUM行;

       -B NUM, --before-context=NUM:在顯示匹配PATTERN的行的同時顯示其前面的NUM行;

       -C NUM, -NUM, --context=NUM:在顯示匹配PATTERN的行的同時顯示其前後各NUM行;

     基本的正則表達式的元字符:

        1) 字符匹配;

           . :匹配任意單個字符;

          []:匹配指定範圍內的任意單個字符;

          [^]:匹配指定範圍以外的任意單個字符;

    下列所有的字符集都可以放置於[]之中用於匹配單個字符;

   [:lower:]:所有小寫的單個字符 

   [:upper:]:所有大寫的字母

     [:alpha:]:所有字母字符

     [:digit:]:所有的十進制數字

   [:space:]:所有的空白字符

   [:alnum:]:表示所有的大小寫字母以及十進制數字

   [:punct:]:所有的標點符號

     [:xdigit:]:所有的十六進制數字;

   a-z:所有的小寫字母

   A-Z:所有的大寫字母

   0-9:標識所有的十進制數字

      

        2)次數匹配

            *:其前面的字符可以出現任意次(0次,1次或多次);

           \?:其前面的字符可有可無(0次或1次);

           \+:其前面的字符至少出現一次(1次或多次);

           \{m\}:其前面的字符必須出現m次;

           \{m,n\}:其前面的字符至少出現m次,至多出現n次;(m<n)

           \{,n\}:其前面的字符至少出現0次,至多出現n次;

           \{m,\}:其前面的字符至少出現m次,×××;


  在正則表達式中,表示任意長度任意字符的方式:.*


  位置錨定字符:

   行錨定:

   行首錨定:^

   行尾錨定:$

   字錨定:

   字首錨定:\<或\b

   字尾錨定:\>或\b

   \b:舊版本中的錨定方法,建議不使用;


  對於正則表達式引擎來說,字是由非特殊字符組成的連續字符串;


  分組與引用字符:

  \(PATTERN\):將此PATTERN所匹配到的所有字符當作一個不可分割的整體來處理


 在正則表達式引擎之中,有一系列的內置變量,這些變量會保存所有分組內的字符信息,用於後向引用;這些變量依次是:\1, \2, \3, ...


   pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)


   \1:pattern2

   \2:pattern4

     \3:pattern5

              \1:第一組小括號中的pattern匹配到的字符;

      \2:第二組小括號中的pattern匹配到的字符;

      ...


    ///// 例:請找出在/etc/passwd中用戶的UID和GID相同的用戶賬戶;

   ~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd


   或:\|

               注意:\|將其左右兩邊的字符串當作整體對待;

                A\|american  :A或american

               請找出ifconfig命令的執行結果中數值在100-255之間的整數;

                    第一位:1 2

   第二位:0-90-4  5

   第三位:0-90-9  0-5


   ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'

           請找出ifconfig命令的執行結果中數值在0-255之間的整數;

     2.grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]


       默認情況下,grep命令後面只允許有一個PATTERN;

       如果想要在一次grep所搜過程中寫多個PATTERN,則需要使用-e選項;每個-e選項只能使用一個PATTERN作爲參數;

         將所需要的PATTERN寫入到一個文件中,保證每行只有一個PATTERN;我們就可以使用-f FILE方式來實現多PATTERN匹配;

      egrep:

       egrep [OPTIONS] PATTERN [FILE...]

       擴展的正則表達式元字符:

     1) 字符匹配;

           . :匹配任意單個字符;

          []:匹配指定範圍內的任意單個字符;

          [^]:匹配指定範圍以外的任意單個字符;

       下列所有的字符集都可以放置於[]之中用於匹配單個字符;

          [:lower:]:所有小寫的單個字符 

          [:upper:]:所有大寫的字母

           [:alpha:]:所有字母字符

           [:digit:]:所有的十進制數字

           [:space:]:所有的空白字符

           [:alnum:]:表示所有的大小寫字母以及十進制數字

           [:punct:]:所有的標點符號

           [:xdigit:]:所有的十六進制數字;

           a-z:所有的小寫字母

           A-Z:所有的大寫字母

           0-9:標識所有的十進制數字

      

        2)次數匹配

            *:其前面的字符可以出現任意次(0次,1次或多次);

           \?:其前面的字符可有可無(0次或1次);

           \+:其前面的字符至少出現一次(1次或多次);

           \{m\}:其前面的字符必須出現m次;

           \{m,n\}:其前面的字符至少出現m次,至多出現n次;(m<n)

           \{,n\}:其前面的字符至少出現0次,至多出現n次;

           \{m,\}:其前面的字符至少出現m次,×××;


   在正則表達式中,表示任意長度任意字符的方式:.*


   位置錨定字符:

    行錨定:

    行首錨定:^

    行尾錨定:$

    字錨定:

    字首錨定:\<或\b

    字尾錨定:\>或\b

       分組與引用字符:

   \(PATTERN\):將此PATTERN所匹配到的所有字符當作一個不可分割的整體來處理


  在正則表達式引擎之中,有一系列的內置變量,這些變量會保存所有分組內的字符信息,         用於後向引用;這些變量依次是:\1, \2, \3, ...


    pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)

     \1:pattern2

    \2:pattern4

     \3:pattern5

              \1:第一組小括號中的pattern匹配到的字符;

       \2:第二組小括號中的pattern匹配到的字符;

       ...


    ///// 例:請找出在/etc/passwd中用戶的UID和GID相同的用戶賬戶;

    ~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd


    或:\|

               注意:\|將其左右兩邊的字符串當作整體對待;

                A\|american  :A或american

   

    fgrep:PATTERN中所有的字符都被當作文本字符來處理;


  其他的文本處理命令:

  wc:

  wc [OPTION]... [FILE]...

  -l:只顯示行數

  -w:只顯示字數

  -c:只顯示字符數


  cut:remove sections from each line of files

  能夠被cut命令修剪的文件,一般都是具有一定結構或格式的文本文檔;/etc/passwd

  cut OPTION... [FILE]...

  -d, --delimiter=DELIM:指定在實施修剪操作時所依賴的分隔符,默認是空白字符;

  -f, --fields=LIST:根據定義的分隔符來指定字段的編號;

  地址定界使用方法:

  #:選擇被指定的單個字段;

  #,#:離散的多個被指定的單個字段;

  #-#:連續的多個被指定的字段;

  --output-delimiter=STRING:指定輸出分隔符;


  awk:

  awk -F "DELIMITER" '[/PATTERN/]{print $1,$2,...$NF}' FILE...

  -F "DELIMITER":指定字段分隔符,默認爲空白字符;

  $1,$2,...,$NF:根據字段分隔符切割出來的文本片段都存放在相應的內部變量中;


  sort:sort lines of text files,將文本文件按行繼續排序,默認排序規則是按照ASCII表中的字符順序進行,這個排序標準可修改;

  -r, --reverse:逆序排序

  -R, --random-sort:隨機排序,這種隨機算法是非常簡陋的,不適用於複雜環境;

  -u, --unique:重複出現的行,只保留一行;(連續且完全相同的行叫重複),祛重;

  -n, --numeric-sort:以數字的數值大小進行排序;

  -t, --field-separator=SEP:指定字段分隔符;

  -k, --key=KEYDEF:指明根據哪個關鍵字段進行排序,一般和-t同時使用;


  uniq:report or omit repeated lines

  -d, --repeated:只顯示重複出現的行,而且每一組重複行只顯示一行;

  -u, --unique:只顯示不重複的行;

  -c, --count:在每行以前綴的方式顯示重複行的重複次數;


  diff:compare files line by line

  同一文件的不同修改版本;打補丁;


  patch:apply changes to files

        

            

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