天天看點

linux正規表達式、sed、awk指令使用總結

一、正規表達式

        linux的正則主要分為基礎正則和拓展正則,基礎的正則如下:

linux正規表達式、sed、awk指令使用總結

        1.正則比對時會最大化比對結果

            正規表達式由于其貪婪比對的邏輯,會将結果進行最大化比對,經常書寫出的正則會超出我們的需要,是以書寫時我們要用定界符到,如/etc/passwd檔案中的第一列為使用者名,用冒号分隔,後面都跟x,如果我們簡單的以:作為分隔符,正則或最大化比對結果,比對到最後一個x,但我們可以如果用:x:來做定界符,就能精确定位到我們想要的結果

linux正規表達式、sed、awk指令使用總結
linux正規表達式、sed、awk指令使用總結

      2.轉義字元的使用

        正則中,隻要不是想要搜尋的符号,就必須加\轉義字元将其轉換為原本的意思,如上表中的 ma(tri)?,[0-9]{3}等正則例子,實際書寫時都要加轉義字元,寫為“ma\(tir\)\?”和'[0-9]\{3\}',而同樣,如果想搜尋的符号中有* ?之内的正則表達符号,也要加轉義字元才能代表原本的符号含義.

        3.[]的注意事項

        [a-zA-Z]代表包含大小寫的所有單個字母,不能寫成[a-Z];

        [a-z_-]代表比對字母或下劃線或橫杠,不能寫成[a-z-_]

        4.寫正則時需要不斷試錯

         即便寫出了比對的正規表達式,用定界符進行精準比對後,正則中仍然會出現結果不符合要求的情況,需要對表達式不斷修改,不斷試錯,才能得到想要的結果

二、grep 指令

       所有參數:

linux正規表達式、sed、awk指令使用總結

        常見用法:

                  1.   -b -o  統計字元串的偏移量(即一行中相對行首的位置差)

echo gun is not unix | grep -b -o "not"
7:not

#一行中字元串的字元偏移是從該行的第一個字元開始計算,起始值為0。選項 -b -o 一般總是配合使用。                               

                    2.-l和-L 在多檔案查找時,僅輸出符合條件/不符合條件的檔案的檔案名,不輸出内容

                    3.-f 和字元串比對,正則式比對不同,将單獨的檔案作為比對樣式,每一個比對的樣式為一行

#在樣式檔案中逐行寫出需要比對的字元。
cat patfile
aaa
bbb

echo aaa bbb ccc ddd eee | grep -f patfile -o           

                      4.-A -B -C  除了輸出比對内容外,還輸出比對内容上/下/上下行的内容,可以指定幾行

#如果比對結果有多個,會用“--”作為各比對結果之間的分隔符:
echo -e "a\nb\nc\na\nd\nc" | grep a -A 1
a
b
--
a
d           

                      5. -q 靜默輸出,不會輸出任何資訊,如果指令運作成功傳回0,失敗則傳回非0值。一般用于條件測試。

                      6.--include 排除目标檔案   

                                 1)--include *{.c,.cpp} 僅僅在檔案夾中搜尋.c和.cpp檔案;  

                                 2)--exclude "README" 排除全部README檔案

                                 3) --include-dir 僅在某些檔案夾中搜尋 

                                 4) --exclude-dir 排除某些檔案夾 

                                 5) --exclude-from FILE 從檔案FILE中讀取須要排除的檔案清單

#隻在目錄中所有的.php和.html檔案中遞歸搜尋字元"main()"
grep "main()" . -r --include *.{php,html}

#在搜尋結果中排除所有README檔案
grep "main()" . -r --exclude "README"

#在搜尋結果中排除filelist檔案清單裡的檔案
grep "main()" . -r --exclude-from filelist           

三、cut:字段簡單剪切指令

             該指令有兩項功能,其一是用來顯示檔案的内容,它依次讀取由參數file所指明的檔案,将它們的内容輸出到标準輸出上;其二是連接配接兩個或多個檔案,如cut fl f2 > f3将把檔案fl和幾的内容合并起來,然後通過輸出重定向符“>”的作用,将它們放入檔案f3中。

                1.格式

                                            cut(options)(參數)

                2.全部參數

linux正規表達式、sed、awk指令使用總結

                   3.常見用法

#學生報表資訊,包含No、Name、Mark、Percent:
[[email protected] text]# cat test.txt 
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
#使用 -f 選項提取指定字段:
[[email protected] text]# cut -f 1 test.txt 
No
01
02
03
[[email protected] text]# cut -f2,3 test.txt 
Name Mark
tom 69
jack 71
alex 68
#--complement 選項提取指定字段之外的列(列印除了第二列之外的列):

[[email protected] text]# cut -f2 --complement test.txt 
No Mark Percent
01 69 91
02 71 87
03 68 98
#使用 -d 選項指定字段分隔符:

[[email protected] text]# cat test2.txt 
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98
[[email protected] text]# cut -f2 -d";" test2.txt 
Name
tom
jack
alex           

注意:cut的分隔符,預設為制表符,可以-d指定其他分隔符,但是不能指定空格(-d " ")!,即如果文本内容以空格分隔,cut會認為文本隻有一列

四、sed:功能強大的流式文本編輯器

                格式:

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)      

                  重要參數:

                -n :即--slient和 -quiet 靜默輸出 隻列印腳本或command處理過行 

                -e :直接在指令行模式上進行sed動作編輯,此為預設選項

                -f :将sed的動作寫在一個檔案内,用–f filename 執行filename内的sed動作 

                -r :支援擴充正規表達式

                -i :直接修改檔案内容,不輸出到螢幕

                    sed command:

linux正規表達式、sed、awk指令使用總結

            注意:

  1.         sed指令中,字元串或正則的兩邊需要加上雙斜杠//  如添加動作:‘/正則式/i’  
  2.          sed '2,4d'  将2-4行内容删除,而不是删除第2行和第4行
  3.         sed 's/book/BOOKS/g' file  g是全局參數,不加隻替換第一個
  4.         &的用法    已比對字元串标記
    echo this is a test line | sed 's/\w\+/[&]/g'
    [this] [is] [a] [test] [line]           
  5.         \1的用法,子串比對标記
    echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
    this is 7 in a number           
  6.         r/w    從檔案讀入,或寫入到檔案(前者不改變檔案内容,後者改變)
    #将比對内容顯示在比對行下
    sed '/test/r file' filename
    #在example中所有包含test的行都被寫入file裡:
    sed -n '/test/w file' example           
  7.         q    中途退出指令
    #列印完第10行後,退出sed
    sed '10q' file           

五、awk:文本和資料進行處理的程式設計語言

        (awk指令比較複雜,涉及到程式設計思想和邏輯判斷,僅總結目前知識水準範圍内的内容)

         1.awk的模式(patten)和操作(command)

           模式可以是以下任意一個:

  • /正規表達式/:使用通配符的擴充集。
  • 關系表達式:使用運算符進行操作,可以是字元串或數字的比較測試。
  • 模式比對表達式:用運算符

    ~

    (比對)和

    ~!

    (不比對)。
  • BEGIN語句塊、pattern語句塊、END語句塊(即拓展commend,一般在BEGIN中指派,申明等,END中進行操作,運算等,BEGIN和END不參與邏輯循環)                

            操作由一個或多個指令、函數、表達式組成,之間由換行符或分号隔開,并位于大括号内,主要部分是:

  •            變量或數組指派
  •            輸出
  •           内置函數
  •            控制流語句

          2. 内置參數(變量)

  1. $0,$1,$2 列數,從0開始(預設空格和制表符為分隔符,-F或fs==指定分隔符)

    awk '{printf $1}' //列印第一個字母

  2. NR,NF 行号和字段數
  3. FILENAME 檔案名
  4. 完整的内置參數如下:
    linux正規表達式、sed、awk指令使用總結

              3.邏輯處理

            作為一種程式設計語言所應具有的特點之一,awk支援多種運算,這些運算與C語言提供的基本相同。awk還提供了一系列内置的運算函數(如log、sqr、cos、sin等)和一些用于對字元串進行操作(運算)的函數(如length、substr等等)。

運算符 描述 舉例
+ - 加,減

awk 'BEGIN{a="b";print a++,++a;}'

輸出:0 2

(注意:所有用作算術運算符進行操作,操作數自動轉為數值,所有非數值都變為0)

*  /  & 乘 除 求餘
++  -- 增加和減少(作為字首和字尾)
> >= != ==

關系運算符

(注意:> < 可以作為字元串比較,也可以用作數值比較,關鍵看操作數如果是字元串就會轉換為字元串比較。兩個都為數字才轉為數值比較。字元串比較:按照ASCII碼順序比較。)

awk 'BEGIN{a=11;if(a >= 9){print "ok";}}'

輸出:ok

= += -= *= ... 指派語句 a+=5; 等價于:a=a+5; 其它同類
||  && 邏輯或,邏輯與

awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}'

輸出:0 1

~ ~! 正規表達式的比對和不比對

awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'

輸出:ok

?: C條件表達式

awk 'BEGIN{a="b";print a=="b"?"ok":"err";}'

輸出:ok

in 數組中是否存在鍵值

awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'

輸出:1

4.拓展格式

拓展格式如下: 

awk [options]'BEGIN{print"START"}pattern{commands}END{print "END"}'

一般在BEGIN中指派,申明等,END中進行操作,運算等,BEGIN和END不參與邏輯循環

awk -F ':' 'BEGIN{print "Line  Col  User"}{print NR"    ",NF"   ",$1}END{print"--------"FILENAME"------------"}'  /etc/passwd  |more
#顯示每行的行号,列數(用:作為分隔符)并在表頭和結束列印相關内容           

5.與sed的比較

    awk和sed都是流式文本資料處理指令,都支援管道操作,一般什麼情況選擇sed,什麼情況選擇awk呢?

1.兩個指令都是行處理指令,具體的邏輯是一次讀入一行内容,然後處理一行内容,處理完成後又處理下一行内容 

2.和sed相比,同樣是對一行的内容進行操作,awk可以進行切片處理,分‘列’進行處理(根據分隔符将一行拆分成多列,如使用内置參數$1 ,$2可對第2列和第3列進行提取操作)

3.sed指令對複雜正則的比對度較高,在處理正則的複雜比對和精确比對時,建議優先考慮使用sed指令

4.awk指令由于可以進行邏輯處理和流程控制,在對文本的操作邏輯性較強時,推薦優先考慮awk指令

參考内容:

https://www.cnblogs.com/tlnshuju/p/7106790.html  grep指令最經常使用的功能總結

http://man.linuxde.net/sed    sed指令_Linux sed 指令用法詳解:功能強大的流式文本編輯器

http://man.linuxde.net/awk   awk指令_Linux awk 指令用法詳解:文本和資料進行處理的程式設計語言

https://www.imooc.com/learn/819 執行個體妙解Sed和Awk的秘密

繼續閱讀