正則(三)

與sed相比,awk支持分段功能正則表達式

1.awk指定分割符

   1) 實現打印指定分隔符分割後的第一段spa

    # awk -F ':' '{print $1}' 文件名字符串

    上述操做不會更改文件內容test

    2) 實現打印指定分隔符分割後的全部段awk

        # awk -F ':' '{print $0}' 文件名變量

        # awk  '{print $0}' 文件名    //與cat命令實現的功能一致,若是awk命令沒有指定分隔符,則默認空格或空白字符爲分隔符進行打印操做sed

    3) 實現打印指定分隔符分割後的指定多個段循環

        # awk -F '分隔符' ‘{print $1,$2,$4}’ 文件名im

    4)給打印出來的內容指定分隔符圖表

        # awk -F ‘:’  ‘{print $1"#"$2"#"$4}’ 文件名

2.awk匹配功能

    1)匹配到指定字符串

        # awk '/字符串/' 文件名

    2)匹配指定段包含指定字符串的行

        # awk -F ':' '$1 ~ /oo/'  文件名

    3)匹配正則表達式

        # awk -F ':' '$1 ~ /o+/' 文件名

    4)支持多個表達式

    # awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt

    上圖表示既要打印包含root的行的第一段和第三段,又要打印包含user的行的第一段第三段第四段

    # awk -F ':' '/root|user/ {print $0}' 文件名

    上圖表示打印出包含root或user的行的內容

    5)值比較

        # awk -F ':' '$3==0' test.txt  //打印出指定段的值等於指定值的行

        # awk -F ':' '$3==11 {print $1}' 文件名 //打印出指定段的值等於指定值的行的指定段

        # awk -F ':' '$3>=」11「 {print $1}' 文件名 //打印出指定段的值大於等於指定字符串的ASCLL碼的行的指定段

在上圖中,數值11使用雙引號括起來表示11看作字符串,使用11的ASCLL碼值去作比較,說明2的ASCLL碼值大於1,依此類推

        # awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt

    上圖表示打印出第七段不等於指定字符串的ASCLL碼值的行

3.兩個字段間作比較

    1)兩個段比較大小

       # awk -F ':' '$3<$4' test.txt

        

        上圖表示將第三段值小於第四段值的行打印出來

        # awk -F ':' '$3==$4' 文件名

        

        上圖表示將第三段值等於第四段值的行打印出來

        # awk -F ':' '$3>"5" && $3<"7"' test.txt

        上圖表示將第三段值大於5且小於7的行打印出來

        # awk -F ':' '$3>100 || $7=="/sbin/nologin"' test.txt

    上圖表示將第三段值大於100或第七段值等於指定字符串的行打印出來

    2)指定打印匹配符

        # awk -F ':' '{OFS="#"} {print $1,$2,$4}' test.txt

    

    上圖中指定打印出來的第一第二第四段的分隔符爲#,須要注意的是OFS要寫在單引號的最前面

    # awk -F ':' '{OFS="#"} {if($3>10) {print $1,$2,$4}}' test.txt

    # awk -F ':' '{OFS="#"} $3>10 {print $1,$2,$4}' test.txt  //這兩條命令運行結果相同

    3)兩個內置變量NF NR

            NF 表示段號, NR表示行號 ,均爲數字

        # awk -F ':' '{print NR":"$0}' test.txt  //將每行的行號打印在行首

        # awk -F ':' '{print NF":"$0}' test.txt  //將每行的段的總數打印在行首

     # awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt   // 將行號做爲判斷條件

    

        上圖表示打印行號小於等於10且第一段包含指定字符串的行

        # awk -F ':' 'NF==7 && $1 ~ /root|sync/' test.txt

    

        上圖表示打印有7段且第一段包含指定字符串的行

    # awk -F ':' '{print $NR":"$NF}' test.txt

        上圖至關於循環打印了第一行的第一段:最後一段、第二行的第2段:最後一段、第三行的第三段:最後一段、依此類推

    4)賦值操做

        # head -3 test.txt |awk -F ':' '$1="root"'

    上圖表示將文件前3行的第一段賦值爲root,注意賦值操做後分隔符如不指定則默認爲空格

    # awk -F ':' '{tot=tot+$3}; END {print tot}' test.txt

    上圖中tot默認初始值爲0,命令含義是將每行的第3段值循環相加並存放到tot中,直到最後打印tot的值

相關文章
相關標籤/搜索