正則表達式

文本處理工具:
     Vim   vi    nano
 文本處理三劍客
Grep系:grep,egrep,fgrep,文本搜索工具,基於“PATTERN”對於給定的文本進行模糊搜索,grep系默認工作於貪婪模式下
Sed:stream editor ,流編輯器,行編輯器,文本編輯工具
Awk:gawk——GUN awk,文本格式化工具,文本報告生成器,文本處理的編程語言,


  Grep系:全稱:Global  search  regular  expression  and  print  out  the  line
      翻譯漢語:利用正則表達式進行全局搜索並將匹配的行顯示出來

  語法結構:grep [OPTIONS] PATTERN [FILE...]
PATTERN:過濾條件,是由正則表達式元字符以及沒有特殊含義的文本字符組成
   正則表達式的元字符:
            會被正則表達式的引擎解釋爲特殊含義
     公認最完整的引擎:pcre__perl語言的正則表達式引擎
   基本的正則表達式:BRE
   擴展的正則表達式:ERE

   Grep默認情況下僅支持基本正則表達式
   Egrep默認情況下僅支持擴展正則表達式
   Fgrep:默認不開啓正則表達式引擎

   文本字符:
      只具備字符便面含義的那些字符

        選項:
          -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行


  PATTERN:
     正則表達式元字符:
       基本的正則表達式元字符:
          GLOBBING-----------------簡化的正則表達式:[  ]  ?  * 
         字符匹配:
           .:匹配任意單個字符
           []:匹配指定範圍內的任意單個字符
          [^]:匹配指定範圍以外的任意單個字符
           下列所有的字符集都可以放置於[](中括號)中,用於匹配單個字符
          [:lower:]
          [:upper:]
          [:alpha:]
          [:digit:]
          [:alnum:]
          [:punct:]
          [:blank:]
          [:xdigit:]:所有的十六進制數字
           a-z:所有的小寫字母
           A-Z:所有的大寫字母
           0-9:標識所有的十進制數字

       次數匹配:該類字符之前的那個字符可以出現的次數
          *(星號):其前門的字符可以出現任意次(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-9   0-4    5
             第三位:0-9   0-9    0-5
 
              ifconfig | grep '\<1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\>'
              請找出ifconfig命令執行結果中數值在0-255之間的整數



        grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
        默認情況下,grep命令後面只允許有一個PATTERN
        如果想要在一次grep所搜過程中寫多個PATTERN,則需要使用-e選項,每個-e選項只能使用一個PATTERN作爲參數;

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


   Egrep:
     語法結構:grep [OPTIONS] PATTERN [FILE...]
      擴展的正則表達式元字符:
             字符匹配:
                .
                []
                [^]
             次數匹配:
                *
                ?
                +
               {m}
               {m,n}
                {m,}
                {0,n}
             位置錨定:
                ^
                $
                \<,\b
                \>,\b
             分組和引用:
                ()
                \1,\2,\3,...
             或:
                |

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

  其他的文本處理命令:
    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
      parch [-R][-i patchfile] [file]


編程語言:
  問題空間:就是使用人類的自然語言描述的任務

  解空間:就是使用編程語言描述任務的實施步驟和顯示最終結果

編程思想:能夠把編程語言所提供的語法格式,隨時隨地轉換成能夠解決問題的思路

對於編程語言的學習:
   1.學習編程語言的語法格式
   2.學習工具的使用(庫,命令)
   3.算法
   4.數據結構

學習編程語言的目標:
   將問題空間和解空間對應起來,最直接的辦法就是使用解空間的語言習慣來進行思考;

   shell腳本編程:
     shell腳本的內容和格式:
       首行,絕對行首,shebang(解釋器程序的絕對路徑)
       註釋信息,以#佔據絕對行首的行
       爲了能夠在程序中突出程序的功能,適當的添加空白行,以分隔不同功能的源代碼塊;
       有一定的縮進


   利用bash腳本編程實現算術運算:
     +,-,
     *,/,
     %:模運算,取餘數
     **|^


   增強型的算術元算符號:
     +=:let B=B+2   --->   let B+=2
     -=:let B-B=2   --->   let B-=2
     *=:let B=B*2   --->   let B*=2
     /=:let B=B/2   --->   let B/=2
     %=:let B=B%2   --->   let B%=2
   特殊的增強型算術運算:
     let B=B+1   --->   let B+=1   --->   let B++
     let B=B-1   --->   let B-=1   --->   let B--

     B++:先將B的值賦給其他變量,然後自身+1
     ++B:先做自身+1,然後再將B值賦給其他變量


    算術運算方法:
      1.let VAR=算術表達式
          將算術表達式先進行算術運算,並將運算得到的結果保存到變量VAR中 
      2.VAR=$[算術表達式]
          算術表達式中有過有變量引用,可以使用$,也可以省略$;
          例子:SUM=$[C+B]相當於SUM=$[$C+$B]
      3.VAR=$[算術表達式]
          算術表達式中如果有變量引用,可以使用$引用,也可以省略$
      4.expr ARGU1 ARGU2 ARGU3
        ARGU1和ARGU3必須是數值
        ARGU2必須是運算符號
      5.echo "算術表達式" | bc

      注意:*號,在某些情況下需要轉義;

      例子:
        統計/etc/fstab,/etc/passwd,/etc/issue三個文件中,以字母r開頭的行數的總和;
           echo $[`grep -c "^r" /etc/passwd`+`grep -c "^r" /etc/issue`+`grep -c "^r" /etc/fstab`]


  變量:存儲數據的容器
    弱變量,弱類型變量,字符(默認)型,數值型(不包括浮點型)

    條件測試命令:
        test  EXPRESSION
          shell內建命令:

        [ EXPRESSION ]
          外部命令:

        ` EXPRESSION `
          bash的內部關鍵字:

      注意:這類命令一般沒有執行結果,只有執行狀態返回值

      test測試命令有三類測試表達式:
        1.數值測試:雙目操作符
          -eq:被測試的兩個數值,是否相等,相等爲真,不等爲假;
          -ne:被測試的兩個數值,是否不相等,不等爲真,相當爲假
          -gt:被測試的兩個數值,左邊的是否大於右邊的,大於爲真,不大於爲假
          -lt:被測試的兩個數值,左邊的是否小於右邊的,小於爲真,不小於爲假
          -ge:被測試的兩個數值,左邊的是否大於等於右邊的,大於等於爲真,小於爲假
          -le:被測試的兩個數值,左邊的是否小於等於右邊的,小於等於爲真,大於爲假

          例子:~/aaa的大小是否小於1000字節
           [root@localhost 桌面]# [ $(ls -l aaa | awk '{print $5}') -lt 1000 ] && echo ok ||echo "bu ok"


        2.字符串測試
        ==|=:被測試的兩個字符串是否相同,相同爲真,不同爲假;
        !=:被測試的兩個字符是否相同,不同爲真,相同爲假
        >:被測試的兩個字符串在ASCII碼錶中對應的二進制數值,左邊是否大於右邊,大於爲真,小於爲假
        <:被測試的兩個字符串在ASCII碼錶中對應的二進制數值,左邊是否小於右邊,小於爲真,大於爲假
  注意:>和<必須在` EXPRESSION `(必須兩個中括號,切有空格)測試語句中
        =~:被測試的兩個字符串,左側字符串能否被右側的PATTERN匹配,能匹配爲真,不能匹配爲假;
     單目操作符:
        -z 'STRING':判斷指定的字符串是否爲空串,空爲真,不空爲假
        -n 'STRING':判斷指定的字符串是否爲非空串,非空爲真,空爲假

        注意:
           1.通常情況下,字符串要加引號,單引號或雙引號,根據實際情況選擇即可
           2.[[]]和[]在某些情況下,可能意義不同;
           3.表達式兩端以及操作符兩端都要有空格;

        3.文件狀態測試
           文件的存在性測試,如果被測試的文件存在爲真,不存在爲假
           -a | -e
             [ -e /backup ]
             [ -a /backup ]
           文件類型測試(先測試存在性)
             -b FILE:被測試的文件是否存在並且是否爲塊設備,存在且爲塊設備,否則爲假
             -c FILE:被測試的文件是否存在並且是否爲字符設備,存在且爲字符設備,否則爲假
             -d FILE:被測試的文件是否存在並且是否爲目錄文件,存在且爲目錄文件,否則爲假
             -f FILE:被測試的文件是否存在並且是否爲普通文件,存在且爲普通文件,否則爲假
             -h FILE:被測試的文件是否存在並且是否爲符號鏈接文件,存在且爲符號鏈接文件,否則爲假
             -L FILE:被測試的文件是否存在並且是否爲符號鏈接文件,存在且爲符號鏈接文件,否則爲假
             -p FILE:被測試的文件是否存在並且是否爲管道文件,存在且爲管道文件,否則爲假
             -S FILE:被測試的文件是否存在並且是否爲套接字文件,存在且爲套接字文件,否則爲假

           文件的訪問權限測試;
             -r FILE:被測試的文件是否存在並且當前有效賬戶是否可讀,文件存在並且當前有用戶可讀爲真,否則爲假
             -w FILE:被測試的文件是否存在並且當前有效賬戶是否可寫,文件存在並且當前有用戶可寫爲真,否則爲假
             -x FILE:被測試的文件是否存在並且當前有效賬戶是否可執行,文件存在並且當前有用戶可執行爲真,否則爲假

           文件的特殊權限標識測試:
             -u FILE:被測試的文件是否存在並且是否設置了SUID權限,文件存在並且設置了SUID權限爲真,否則爲假
             -g FILE:被測試的文件是否存在並且是否設置了SGID權限,文件存在並且設置了SGID權限爲真,否則爲假
             -k FILE:被測試的文件是否存在並且是否設置了STICKY權限,文件存在並且設置了STICKY權限爲真,否則爲假

           文件的所有權測試:
             -O FILE:被測試的文件是否存在並且其屬主是否爲當前有效用戶,有效爲真,否則爲假
             -G FILE:被測試的文件是否存在並且其屬組是否爲當前有效用戶的組,有效爲真,否則爲假

           文件內容是否爲空:
             -s FILE:被測試的文件是否存在並且內容不爲空,存在且內容不空爲真,否則爲假

           時間戳測試:
             -N FILE:被測試的文件自從上一次被修改之後,是否被修改過,修改過爲真,否則爲假

           雙目測試:
             FILE1 -ef FILE2:測試兩個文件是否指向同一個文件系統的相同inode的硬鏈接
             FILE1 -ef FILE2:被測試的兩個文件,FILE1是否比FILE2更新,更新爲真,否則爲假
             FILE1 -ef FILE2:被測試的兩個文件,FILE1是否比FILE2更舊,更舊爲真,否則爲假

    測試語句中可以田間邏輯運算:
      第一種表達方式:
        [ -O /tmp/test ] && [ -s /tmp/test ]
        [ -O /tmp/test ] || [ -s /tmp/test ]

      第二種表達方式:
        [ -O /tmp/test -a -s /tmp/test ]
        [ -O /tmp/test -o -s /tmp/test ]
        [!-O /tmp/test ]

    命令的執行結果:
      正常的輸出結果:

      命令的執行狀態返回值:
          0-255
          0:表示命令執行成功
          1,2,127:系統保留
          3-126,128-255:用戶自定義的執行狀態返回值   

      exit[#]退出當前shell的登錄
        當shell腳本運行時,一旦遇到exit命令,將立即結束當前shell進程,同時腳本的運行也將被停止,即exit後面的所有命令都不再被解釋執行;


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