溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

shell腳本及正則表達(dá)式

發(fā)布時(shí)間:2020-07-21 14:19:28 來(lái)源:網(wǎng)絡(luò) 閱讀:843 作者:運(yùn)維小弟qaq 欄目:網(wǎng)絡(luò)安全

shell腳本的編寫(xiě)及正則表達(dá)式:

    一、shell腳本的基本:

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

        1)純文本文檔--文件中所存儲(chǔ)的數(shù)據(jù)都是以字符為單位進(jìn)行存儲(chǔ)的;

        2)根據(jù)用戶(hù)的需求來(lái)解決用戶(hù)問(wèn)題的大量命令的組合體

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

             注意:很多命令都不具備“執(zhí)行冪等性”,在shell腳本中就需要大量的程序邏輯來(lái)判斷某個(gè)命令是否滿(mǎn)足其運(yùn)行條件,以避免在運(yùn)行過(guò)程中出現(xiàn)嚴(yán)重錯(cuò)誤。

   

   2.腳本的基本代碼內(nèi)容:

       1)首先我們可以利用文本編輯工具來(lái)編寫(xiě)shell腳本:

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

           在這里我們推薦使用Vim,因?yàn)樗哂姓Z(yǔ)法著色,自動(dòng)縮進(jìn)等特性


        腳本的命令方式:可以使用.sh的文件名為后綴;在低版本的Vim編輯器,只能根據(jù).sh的后綴命令來(lái)識(shí)別是否為shell腳本,高版本的Vim編輯器,則無(wú)需過(guò)多的文件后綴名的問(wèn)題;

      

       2)shebang:首行必須是shebang,解釋器路徑,必須占據(jù)就對(duì)行首:在執(zhí)行時(shí),啟動(dòng)相應(yīng)的解釋器以解釋腳本內(nèi)諸多的命令

         因?yàn)槲覀兪褂玫膕hell為bash

          #! /bin/bash

       3) 在shell腳本中,除了shebang之外,所有以#開(kāi)頭的行都為注釋行,解釋器都會(huì)忽略這樣的行的內(nèi)容

    例如:

         # author:秦耀東

         # type:基礎(chǔ)練習(xí)

         ...

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

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

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

 /// 注意:shell腳本一旦運(yùn)行,是在當(dāng)前的shell中根據(jù)shebang的指示,開(kāi)啟一個(gè)解釋器(子shell)解釋執(zhí)行代碼內(nèi)容,shell腳本的內(nèi)容是在一個(gè)子shell進(jìn)程中實(shí)現(xiàn)的;

      

    3.腳本的運(yùn)行方法:

       1)為腳本文件賦予執(zhí)行權(quán)限,直接運(yùn)行此文件:

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

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

       2)直接使用解釋器運(yùn)行腳本,講腳本作為解釋器命令的參數(shù);

            bash /PATH/TO/SCRIPT_FILE

            bash -x /PATH/TO/SCRIPT_FILE(將腳本的運(yùn)行過(guò)程展示出來(lái),一般用于腳本排錯(cuò))

            bash -n /PATH/TO/SCRIPT_FILE(對(duì)腳本進(jìn)行語(yǔ)法排錯(cuò),如果存在語(yǔ)法錯(cuò)誤,則 bash會(huì)給予提示,針對(duì)于這類(lèi)錯(cuò)誤提示,,需要我們自行判斷錯(cuò)誤的發(fā)生位置)



  二、正則表達(dá)式:

  

在學(xué)習(xí)正則表達(dá)式之前我們先來(lái)學(xué)習(xí)文本處理工具:

文本處理三劍客:

grep系:grep、egrep、fgrep,文本搜索工具,基于"PATTERN"對(duì)于給定的文本進(jìn)行模糊搜索,grep系默認(rèn)工作于貪婪模式下;


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


awk:gawk——GNU awk,文本格式化工具,文本報(bào)告生成器,文本處理的編程語(yǔ)言;


  1.grep系:grep  egrep  fgrep

     

     1:grep:默認(rèn)僅支持基本正則表達(dá)式

       全稱(chēng)為Global search Regular Expression and Print out the line.利用正則表達(dá)式進(jìn)行全局搜索并將匹配的行顯示出來(lái);

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

          ////這里我們要介紹一下PATTERN,PATTERN是一種過(guò)濾條件,是由正則表達(dá)式元字符以及沒(méi)有特殊含義的文本字符組成;

            正則表達(dá)式的元字符會(huì)被正則表達(dá)式引擎解釋為特殊含義;

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

       常用選項(xiàng)為:

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

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

        -c, --count:計(jì)數(shù),統(tǒng)計(jì)匹配PATTERN的所有的行數(shù);

       -o, --only-matching:關(guān)閉貪婪模式,僅顯示PATTERN能夠匹配的內(nèi)容;

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

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

    --color=auto

       -E, --extended-regexp:擴(kuò)展的正則表達(dá)式,grep -E相當(dāng)于egrep;

        -F, --fixed-strings, --fixed-regexp:grep -F相當(dāng)于fgrep

        -G, --basic-regexp:基本的正則表達(dá)式,egrep -G相當(dāng)于grep

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

       -A NUM, --after-context=NUM:在顯示匹配PATTERN的行的同時(shí)顯示其后面的NUM行;

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

       -C NUM, -NUM, --context=NUM:在顯示匹配PATTERN的行的同時(shí)顯示其前后各NUM行;

     基本的正則表達(dá)式的元字符:

        1) 字符匹配;

           . :匹配任意單個(gè)字符;

          []:匹配指定范圍內(nèi)的任意單個(gè)字符;

          [^]:匹配指定范圍以外的任意單個(gè)字符;

    下列所有的字符集都可以放置于[]之中用于匹配單個(gè)字符;

   [:lower:]:所有小寫(xiě)的單個(gè)字符 

   [:upper:]:所有大寫(xiě)的字母

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

     [:digit:]:所有的十進(jìn)制數(shù)字

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

   [:alnum:]:表示所有的大小寫(xiě)字母以及十進(jìn)制數(shù)字

   [:punct:]:所有的標(biāo)點(diǎn)符號(hào)

     [:xdigit:]:所有的十六進(jìn)制數(shù)字;

   a-z:所有的小寫(xiě)字母

   A-Z:所有的大寫(xiě)字母

   0-9:標(biāo)識(shí)所有的十進(jìn)制數(shù)字

      

        2)次數(shù)匹配

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

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

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

           \{m\}:其前面的字符必須出現(xiàn)m次;

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

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

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


  在正則表達(dá)式中,表示任意長(zhǎng)度任意字符的方式:.*


  位置錨定字符:

   行錨定:

   行首錨定:^

   行尾錨定:$

   字錨定:

   字首錨定:\<或\b

   字尾錨定:\>或\b

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


  對(duì)于正則表達(dá)式引擎來(lái)說(shuō),字是由非特殊字符組成的連續(xù)字符串;


  分組與引用字符:

  \(PATTERN\):將此PATTERN所匹配到的所有字符當(dāng)作一個(gè)不可分割的整體來(lái)處理


 在正則表達(dá)式引擎之中,有一系列的內(nèi)置變量,這些變量會(huì)保存所有分組內(nèi)的字符信息,用于后向引用;這些變量依次是:\1, \2, \3, ...


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


   \1:pattern2

   \2:pattern4

     \3:pattern5

              \1:第一組小括號(hào)中的pattern匹配到的字符;

      \2:第二組小括號(hào)中的pattern匹配到的字符;

      ...


    ///// 例:請(qǐng)找出在/etc/passwd中用戶(hù)的UID和GID相同的用戶(hù)賬戶(hù);

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


   或:\|

               注意:\|將其左右兩邊的字符串當(dāng)作整體對(duì)待;

                A\|american  :A或american

               請(qǐng)找出ifconfig命令的執(zhí)行結(jié)果中數(shù)值在100-255之間的整數(shù);

                    第一位: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]\)\>'

           請(qǐng)找出ifconfig命令的執(zhí)行結(jié)果中數(shù)值在0-255之間的整數(shù);

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


       默認(rèn)情況下,grep命令后面只允許有一個(gè)PATTERN;

       如果想要在一次grep所搜過(guò)程中寫(xiě)多個(gè)PATTERN,則需要使用-e選項(xiàng);每個(gè)-e選項(xiàng)只能使用一個(gè)PATTERN作為參數(shù);

         將所需要的PATTERN寫(xiě)入到一個(gè)文件中,保證每行只有一個(gè)PATTERN;我們就可以使用-f FILE方式來(lái)實(shí)現(xiàn)多PATTERN匹配;

      egrep:

       egrep [OPTIONS] PATTERN [FILE...]

       擴(kuò)展的正則表達(dá)式元字符:

     1) 字符匹配;

           . :匹配任意單個(gè)字符;

          []:匹配指定范圍內(nèi)的任意單個(gè)字符;

          [^]:匹配指定范圍以外的任意單個(gè)字符;

       下列所有的字符集都可以放置于[]之中用于匹配單個(gè)字符;

          [:lower:]:所有小寫(xiě)的單個(gè)字符 

          [:upper:]:所有大寫(xiě)的字母

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

           [:digit:]:所有的十進(jìn)制數(shù)字

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

           [:alnum:]:表示所有的大小寫(xiě)字母以及十進(jìn)制數(shù)字

           [:punct:]:所有的標(biāo)點(diǎn)符號(hào)

           [:xdigit:]:所有的十六進(jìn)制數(shù)字;

           a-z:所有的小寫(xiě)字母

           A-Z:所有的大寫(xiě)字母

           0-9:標(biāo)識(shí)所有的十進(jìn)制數(shù)字

      

        2)次數(shù)匹配

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

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

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

           \{m\}:其前面的字符必須出現(xiàn)m次;

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

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

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


   在正則表達(dá)式中,表示任意長(zhǎng)度任意字符的方式:.*


   位置錨定字符:

    行錨定:

    行首錨定:^

    行尾錨定:$

    字錨定:

    字首錨定:\<或\b

    字尾錨定:\>或\b

       分組與引用字符:

   \(PATTERN\):將此PATTERN所匹配到的所有字符當(dāng)作一個(gè)不可分割的整體來(lái)處理


  在正則表達(dá)式引擎之中,有一系列的內(nèi)置變量,這些變量會(huì)保存所有分組內(nèi)的字符信息,         用于后向引用;這些變量依次是:\1, \2, \3, ...


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

     \1:pattern2

    \2:pattern4

     \3:pattern5

              \1:第一組小括號(hào)中的pattern匹配到的字符;

       \2:第二組小括號(hào)中的pattern匹配到的字符;

       ...


    ///// 例:請(qǐng)找出在/etc/passwd中用戶(hù)的UID和GID相同的用戶(hù)賬戶(hù);

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


    或:\|

               注意:\|將其左右兩邊的字符串當(dāng)作整體對(duì)待;

                A\|american  :A或american

   

    fgrep:PATTERN中所有的字符都被當(dāng)作文本字符來(lái)處理;


  其他的文本處理命令:

  wc:

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

  -l:只顯示行數(shù)

  -w:只顯示字?jǐn)?shù)

  -c:只顯示字符數(shù)


  cut:remove sections from each line of files

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

  cut OPTION... [FILE]...

  -d, --delimiter=DELIM:指定在實(shí)施修剪操作時(shí)所依賴(lài)的分隔符,默認(rèn)是空白字符;

  -f, --fields=LIST:根據(jù)定義的分隔符來(lái)指定字段的編號(hào);

  地址定界使用方法:

  #:選擇被指定的單個(gè)字段;

  #,#:離散的多個(gè)被指定的單個(gè)字段;

  #-#:連續(xù)的多個(gè)被指定的字段;

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


  awk:

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

  -F "DELIMITER":指定字段分隔符,默認(rèn)為空白字符;

  $1,$2,...,$NF:根據(jù)字段分隔符切割出來(lái)的文本片段都存放在相應(yīng)的內(nèi)部變量中;


  sort:sort lines of text files,將文本文件按行繼續(xù)排序,默認(rèn)排序規(guī)則是按照ASCII表中的字符順序進(jìn)行,這個(gè)排序標(biāo)準(zhǔn)可修改;

  -r, --reverse:逆序排序

  -R, --random-sort:隨機(jī)排序,這種隨機(jī)算法是非常簡(jiǎn)陋的,不適用于復(fù)雜環(huán)境;

  -u, --unique:重復(fù)出現(xiàn)的行,只保留一行;(連續(xù)且完全相同的行叫重復(fù)),祛重;

  -n, --numeric-sort:以數(shù)字的數(shù)值大小進(jìn)行排序;

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

  -k, --key=KEYDEF:指明根據(jù)哪個(gè)關(guān)鍵字段進(jìn)行排序,一般和-t同時(shí)使用;


  uniq:report or omit repeated lines

  -d, --repeated:只顯示重復(fù)出現(xiàn)的行,而且每一組重復(fù)行只顯示一行;

  -u, --unique:只顯示不重復(fù)的行;

  -c, --count:在每行以前綴的方式顯示重復(fù)行的重復(fù)次數(shù);


  diff:compare files line by line

  同一文件的不同修改版本;打補(bǔ)??;


  patch:apply changes to files

        

            

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI