Linux GNU AWK使用

                                Linux GNU AWK使用

本章內容:

awk介紹

awk基本用法

awk變量

awk格式化

awk操作符

awk條件判斷

awk循環

awk數組

awk函數

調用系統命令

 

文本處理三工具: grepsedawk

grep:文本過濾工具;

sed:行編輯器;

awk:報告生成器,格式化文本輸出;

  awkAho Weinberger Kernighan,報告生成器,格式化文本輸出。

  awk:有多重版本:New awk nawkGNU awk gawk)。

  gawk – 模式掃描和處理語言。

       gawk [ POSIX or GNU style options ] -f program-file [ — ] file …

       gawk [ POSIX or GNU style options ] [ — ] program-text file …

       pgawk [ POSIX or GNU style options ] -f program-file [ — ] file …

       pgawk [ POSIX or GNU style options ] [ — ] program-text file …

awk程序通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊,共3部分組成。

      program:通常使用單引號(’’)把{}引起來。

awk基本用法:

     gawk [option] program FILE…….

     programPATTERN{ACTION STATEMENTS} 語句之間用分號分隔;

     選項:

         -F:指明輸入時用到的字段分隔符;默認以空白作為分隔符。

         -vvar=value 自定義變量。

 

     print:  item=字段的意思。

           1)多個item之間使用“,”逗號分隔。

           2)輸出的各item可以是字符,也可以是數值,變量或awk的表達式。

           3)如果省略item$1…)相當于print $0 整行的內容。

     printf:可以調整文本的寬度,間隔等,比print功能要強。

     

     分隔符、域和記錄:

           awk執行時,由分隔符分隔的字段(域)標記$1 $2 …..$n稱為域標識。$0為所有域,代表整個文件。

     注意:awk中的$符和shell中的$符含義是不同的。

     文件的每一行稱為記錄。

     省略action,則默認執行print $0 的操作。

 

awk的工作原理:

     第一步:執行BEGIN{action;…..}語句塊中的語句。

        示例:

          [root@centos6 Desktop]# awk 'BEGIN{print "hello world"}'

          hello world

          [root@centos6 Desktop]#

 

     第二部:從文件或標準輸入(stdin)讀取一行,然后執行pattern{action;…..}語句塊,它逐行掃描文件,從第一行到最后一行重復這個過程,直到文件全部被讀取完畢。

         示例:

          [root@centos6 Desktop]# awk -F: '{print "username:"$1\t"uid:"$3}' /etc/passwd

          username:root uid:0

          username:bin uid:1

          username:daemon uid:2

          username:adm uid:3

          ………………………………

          [root@centos6 Desktop]#

 

     第三部:當讀取完文件時,執行END{action….}語句塊。

     BEGIN語句塊在awk開始讀取文件行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通??梢詫懺?/span>BEGIN語句塊中。

     END語句塊在awk讀取完文件行之后被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選的語句塊。

     pattern語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供pattern語句塊,則默認執行{print},即完整打印每一個讀取到的行,awk讀取到的每一行都會執行該語句塊。

 

     -v選項的變量:

       1)內建變量:input

              FS:指明列分隔符,(類似于cut中的f),默認以空白字符作為分隔符。

                  [root@centos6 ~]# awk  -v  FS=":" '{print $1}' /etc/passwd

 

              OFS:指明輸出字段的分隔符,默認以空白字符作為分隔符。

                  [root@centos6 ~]# awk -v FS=":" -v OFS="=" '{print $1,$3,$6}' /etc/passwd

 

              RS:指明換行分隔符,指定輸入時的換行符,原換行符仍有效。

                   awk -v RS=" "  '{print}' /etc/passwd

 

              ORS:指明以什么代替回車換行符,輸出時用指定的符號代替換行符。

                   awk -F: -v ORS="########" '{print $1,$2 }'  /etc/passwd

                   root x##############bin x##############daemon x

 

              NF:顯示每行的字段總數。

                1

                  [root@centos6 Desktop]# awk -F: '{print NF}' /etc/passwd

                     7

                     7

                     7

                     ……………………….

                     [root@centos6 Desktop]#

                   2、

                     [root@centos6 Desktop]# awk -F: '{print $(NF-6)}' /etc/passwd

                     root

                     bin

                     daemon

                     [root@centos6 Desktop]#

              

              NR:顯示行號。

                1、

                  [root@centos6 Desktop]# awk -F: '{print NR,$1}' /etc/passwd

                     1 root

                     2 bin

                     3 daemon

                     4 adm

                     [root@centos6 Desktop]#

                  2、

                     [root@centos6 Desktop]# awk -F: END'{print NR,$1}' /etc/passwd

                     38 named

                     [root@centos6 Desktop]#

        

              FNR:各文件分別計數,統計行號。

                   [root@centos6 Desktop]#  awk '{print FNR, $0}' /etc/issue  /etc/issue

                   1 CentOS release 6.8 (Final)

                   2 Kernel \r on an \m

                   3

                   1 CentOS release 6.8 (Final)

                   2 Kernel \r on an \m

                   3

                   [root@centos6 Desktop]#

 

              FILENAME:顯示當前文件名。

                   [root@centos6 Desktop]#  awk '{print FILENAME, $0}' /etc/issue

                      /etc/issue CentOS release 6.8 (Final)

                      /etc/issue Kernel \r on an \m

                      /etc/issue

                      [root@centos6 Desktop]#

             

              ARGC:顯示命令行參數的個數。

                   [root@centos6 Desktop]# awk BEGIN'{print ARGC}'  /etc/fstab /etc/issue

                       3

                      [root@centos6 Desktop]#

 

              ARGV:數組,保存的是命令行所給定的各參數。

                  0、

                      [root@centos6 Desktop]# awk '{print ARGV[0]}' /etc/fstab /etc/issue

                      awk

                     1、

                      [root@centos6 Desktop]# awk '{print ARGV[1]}' /etc/fstab /etc/issue

                      /etc/fstab

                     2、

                      [root@centos6 Desktop]# awk '{print ARGV[2]}' /etc/fstab /etc/issue

                      /etc/issue

 

         2)自定義變量:

                 1-v  var=value (變量名區分字符大小寫)

                 2)在program中直接定義

   

            示例:

          1、 [root@centos6 ]# awk -F: -v name=username '{print name,$1 }'    /etc/passwd

               username root

               username bin

               username daemon

               ………………………………..

          2、[root@centos6 ]# awk -F: '{name="username";print name,$1}' /etc/passwd

               username root

               username bin

               username daemon

               ………………………………..

 

 

printf命令:

       格式化輸出:printf FORMAT”,item1item2

          1)必須指定FORMAT。

          2)不會自動換行,需要顯示給出換行控制符,\n。

          3FORMAT中需要分別為后面每個item指定格式符。

        

       格式符:與item一一對應:

            %c:顯示字符的ASCII碼;

            %d,%i:顯示十進制整數;

            %e%E:顯示科學計數法數值;

            %f:顯示為浮點數;

            %g,%G:以科學計數法或浮點形式顯示數值;

            %s:顯示字符串;

            %u:無符號整數;

            %%:顯示%本身;

 

       修飾符:

            #[.#]:第一個數字控制顯示的寬度,第二個#表示小數點后精度,例:%3.1f

            –:左對齊(默認右對齊)%-10s

            +:顯示數值的正負符號%+10d

          

       示例:

             1、 以右對齊20個字打印/etc/passwd的第一個字段,以左對齊10個字符打印/etc/passwd的第二個字段。

                 [root@centos6 ]# awk -F: '{printf "%20s======== %-10d\n" ,$1,$2}' /etc/passwd

                 root======== 0         

                 bin======== 0         

                 daemon======== 0         

                 adm======== 0  

            2、

                [root@centos6 ]# awk -F: '{printf "nameuser:%-15s===== uid:%d\n",$1,$3}' /etc/passwd

                 nameuser:root           ===== uid:0

                 nameuser:bin            ===== uid:1

                 nameuser:daemon         ===== uid:2

 

算數操作符:

      +(加)、(減)、*(乘)、/(除)、^(次冪)、%(取模運算) 

        示例:

         [root@centos6 Desktop]# awk BEGIN'{print 10^10}'

           10000000000

          [root@centos6 Desktop]#

 

賦值操作符:

     =、+=、-=、*=、/=%=、%=、++、

       示例:

           [root@centos6 ~]# awk -v i=1 BEGIN'{print i+=5}'

         6

         [root@centos6 ~]# awk -v i=1 BEGIN'{print i*=5}'

         5

         [root@centos6 ~]# awk -v i=10 BEGIN'{print i/=5}'

         2

         [root@centos6 ~]# awk -v i=10 BEGIN'{print i++}'

         10

         [root@centos6 ~]# awk -v i=10 BEGIN'{print ++i}'

         11

         [root@centos6 ~]# awk -v i=10 BEGIN'{print –i}'

         9

         [root@centos6 ~]# awk -v i=10 BEGIN'{print i++,i}'

         10 11

         [root@centos6 ~]#

 

 比較操作符:

      > 、>= < 、<=!=、==

 

      示例:

       1[root@centos6 ~]# awk -F: '$3<=2 {print $1}' /etc/passwd

          root

          bin

          daemon

          [root@centos6 ~]#

       2、[root@centos6 ~]# awk -F: '$3>0 {print $1,$3}' /etc/passwd

       3、[root@centos6 ~]# awk -F: '$3==0 {print $1}' /etc/passwd

           root

           [root@centos6 ~]#

       4、[root@centos6 ~]# awk -F: '$3>0 && $3<5{print $1}' /etc/passwd

           bin

           daemon

           adm

           lp

           [root@centos6 ~]#

 

 模式匹配符:

     ~:左邊匹配包含右邊的全部顯示出來;

     !~:左邊和右邊不匹配的全部顯示;

 

   示例:

      1、行中包括root字符的全部顯示出來。

         [root@centos6 ~]# awk '$0~"root"{print $0}' /etc/passwd

        root:x:0:0:root:/root:/bin/bash

        operator:x:11:0:operator:/root:/sbin/nologin

       [ root@centos6 ~]#

      2、除了上面兩行顯示的內容,都顯示出來。

       [root@centos6 ~]# awk '$0!~"root"{print $0}' /etc/passwd

     3、在/etc/passwd中第一字段包含以root開頭的顯示出來。

        [root@centos6 ~]# awk -F: '$1~"^root"{print $1}' /etc/passwd

        root

        [root@centos6 ~]#

 

  邏輯操作符: &&  ||  非!

     示例:

      1、[root@centos7 Desktop]# awk -F: '$3==0 || $3==1000{print $1}' /etc/passwd

          root

          zheng

         [root@centos7 Desktop]#

      2、[root@centos7 Desktop]# awk -F: '$3>0 && $3<=5{print $1}' /etc/passwd

          bin

         daemon

         adm

         lp

         sync

         [root@centos7 Desktop]#

      3、[root@centos7 Desktop]# awk -F: '!($3>0){print $1}' /etc/passwd

          root

          [root@centos7 Desktop]#

 

條件表達式:(三目表達式):

       selector?if-true-expression:if-false-xepression

 

       示例:

       [root@centos7]#awk-F:'$3>1000?username="commonuser":username="sysuser"{printf "%-20s %-10s===== %d\n",username, $1,$3}' /etc/passwd

 

awk pattern

pattern:根據pattern條件,過濾匹配到的行,在做處理。

 1)如果未指定pattern:空模式,匹配每一行。

 2/regular expression/:僅處理能夠匹配到的行,需要用/  /括起來。

 3/regular expression/:關系表達式,結果有“真”有“假”,結果為“真”才會被處理。     

   真:結果為非0值,非空字符串;

   假:結果為空字符串或0值;

 4line ranges:行范圍。

      startlineendline/pattern1/,/pattern2/不支持直接給出數字格式。

 5BEGINEND模式:

      BEGIN{}:僅在開始處理文件中的文本之前執行一次。

      END:僅在文本處理完成之后執行一次。

 

示例:

 1、[root@centos7 Desktop]# awk '/^UUID/{printf "%s\n", $1}' /etc/fstab

   UUID=2de5de7c-8ba6-4ce3-a56f-71ddc0e51765

   UUID=fe32016e-a798-4b03-91a1-55adfd9a4355

   UUID=f51b97fa-1ced-4ef0-9635-3d6d8f6feb5e

   UUID=2bb4030e-68e8-4640-a3ac-62b98c029967

   [root@centos7 Desktop]#

2、取反:[root@centos7 Desktop]# awk '!(/^UUID/){printf "%s\n", $0}' /etc/fstab

3、[root@centos7 Desktop]# awk '!0' /etc/passwd (為“真”可以打印/etc/passwd文件)

4、[root@centos7 Desktop]# awk '!1' /etc/passwd(為“假”不進行打印)

       [root@centos7 Desktop]#

    5、[root@centos7 Desktop]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd

       root /bin/bash

       zheng /bin/bash

       yibo /bin/bash

       mage /bin/bash

       [root@centos7 Desktop]#

 

示例:line ranges:行范圍。

     1、[root@centos7 Desktop]# awk -F: '/^root\>/,/^adm\>/{print $1}' /etc/passwd

    root

    bin

    daemon

    adm

    [root@centos7 Desktop]#

   2、[root@centos7 Desktop]# awk -F: 'NR>=10&&NR<=15{print $1}' /etc/passwd

    operator

    games

    ftp

    nobody

    dbus

    polkitd

    [root@centos7 Desktop]#

       

示例:BEGIN/END模式:

 [root@centos7 Desktop]# awk -F: 'BEGIN{print "username  uid"}NR>=10&&NR<=20{printf "%-15s========= %-10d\n",$1,$3}END{print  "end file"}' /etc/passwd

  

 awk奇數偶數總結:

    示例:

  [root@centos7 Desktop]# seq 2 | awk 'i=0'

  [root@centos7 Desktop]# seq 2 | awk 'i=1'

  1

  2

  [root@centos7 Desktop]# seq 2 | awk 'i=!i'

  1

  [root@centos7 Desktop]# seq 2 | awk '!(i=!i)'

  2

  [root@centos7 Desktop]# seq 4 | awk '{i=!i;print i}'

  1

  0

  1

  0

  [root@centos7 Desktop]#

 

使用awk取文件的奇數行:

     示例:

       [root@centos7 Desktop]# awk 'NR%2{print NR,$1}' /etc/fstab

       1

       3 #

       5 #

       7 #

       9 UUID=2de5de7c-8ba6-4ce3-a56f-71ddc0e51765

         11 UUID=f51b97fa-1ced-4ef0-9635-3d6d8f6feb5e

         13 /dev/sdb1

         [root@centos7 Desktop]#

 

使用awk取文件的偶數行:

     示例:

       [root@centos7 Desktop]# awk '!(NR%2){print NR,$1}' /etc/fstab

       2 #

       4 #

       6 #

       8 #

      10 UUID=fe32016e-a798-4b03-91a1-55adfd9a4355

      12 UUID=2bb4030e-68e8-4640-a3ac-62b98c029967

      [root@centos7 Desktop]#

 

awk action

   常用的action分類:

1expressions:算術,比較表達式;

2control statementsifwhile等;

3compound statements:組合語句;

4input statements

5output statementprint;

 

awk控制語句if-else

語法:{ifconditionstatement [else statememt]}

      {ifcondition1{statement1}else if (condition2){statement2} else{statement3}}

 

    示例:

  1、查找/etc/passwd文件,如果$3是大于等于1000的行,然后打印$1、$3

     [root@centos7 ~]# awk -F: '{if($3>=1000){print $1,$3}}' /etc/passwd

     nfsnobody 65534

     zheng 1000

     yibo 1001

     mage 1002

     [root@centos7 ~]#

 

 2、查找/etc/passwd文件中,如果$7段中等于/bin/bash,然后打印$1S。

    [root@centos7 ~]# awk -F: '{if($NF=="/bin/bash"){print $1}}' /etc/passwd

    root

    zheng

    yibo

    mage

    [root@centos7 ~]#

 

 3、查找出/etc/fstab文件中字段數大于5的行;

   [root@centos7 ~]# awk '{if(NF>5){print $0}}' /etc/fstab

 

 4、查找/etc/passwd文件中,如果$3大于等于1000,則打印common user并打印$1,否則打印root or sysuser 并打印$1。

   [root@centos7 ~]# awk -F: '{if($3>=1000){printf "common user:%s\n",$1}else {printf "root or sysuser: %s\n",$1}}' /etc/passwd

 

 5、使用awk中的if、else ifelse判斷語句:

     awk -v test=100 'BEGIN{print test;if(test>90){print "very good"}else if(test>70){print "good"}else {print "no pass"}}'  (因為代碼后沒有別的參數了,說以前面要執行BEGIN

 

awk 控制語句while循環:

語法 {whilecondition{statement}}

條件為“真”進入循環,條件“假”退出循環;

使用場景:

    對行內的多個字段行逐一處理時使用;

    對數組中的各元素逐一處理時使用;

   

示例:

 1、使用while循環打印出/etc/grub2.cfg中的,以空格linux16開頭的行的字段和字段的字符長度。

   awk '/^[[:space:]]+linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg

 

 2、使用while循環打印出/etc/grub2.cfg中的,以空格linux16開頭的行的字段和字段的字符長度大于等于10的。

    awk '/^[[:space:]]+linux16/{i=1;while(i<=NF){if(length($i)>=10)print $i,length($i);i++}}' /etc/grub2.cfg

 

awk控制語句do-while循環:

語法:do{statement}whilecondition

意義:無論真假,至少執行依次循環體。

 

示例:

  1、使用do-while語句執行1加到100sum。

     awk 'BEGIN{sum=0;i=0;do{sum+=i;i++;print i,sum}while(i<=100){print sum}}'

 

  2、測試執行命令花費的時間:

     [root@centos7]# time awk 'BEGIN{sum=0;i=0;do{sum+=i;i++;print i,sum}while(i<=100){print sum}}'

 

awk 控制語句for循環:

語法:forexpr1;expr2;expr3{statement}

特殊用法:能夠遍歷數組中的元素;

 

示例:使用for循環打印出/etc/grub2.cfg中的,以空格linux16開頭的行的字段和字段的字符長度。

  awk '/^[[:space:]]+linux16/{for(i=1;i<=NF;i++){print $i,length($i)}}' /etc/grub2.cfg

 

性能比較:

可以使用time命令測試一條命令執行的時間長短:

 

  示例:測試seq 1加到100所用的時間;

    [root@centos7 Desktop]# time seq -s "+" 100 >> /dev/null |bc

 

    real 0m0.006s

    user 0m0.001s

    sys 0m0.008s

    [root@centos7 Desktop]#

 

awk 控制語句 switch語句:

    

語法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}

breakcontinue以及next的用法:

 

示例:

1、計算100以內所有奇數的和。

     awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0){continue}sum+=i;print sum}}'

  

2、計算150的和:

       awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i>50){break}sum+=i;print sum}}'

 

3、打印/etc/passwd文件中的偶數行:

    [root@centos7 Desktop]# awk -F: '{if($3%2!=0)next;print $1,$3}' /etc/passwd

 

awk數組:

1)可以使用任意字符串,字符串要使用雙引號括起來。

2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空”。

3)若要判斷數組中是否存在某元素,要使用index in array格式進行遍歷。

4)若要遍歷數組中的每個元素,要使用for循環。

 

示例:

    1、創建數組并打印數組中的某個元素。

         awk 'BEGIN{jiaotong["a"]="huoche";jiaotong["b"]="feiji";jiaotong["3"]="qiche";print jiaotong["3"]}'

 

    2、去除文件中重復的行:

       awk ‘!arr[$0]++’  file

    

        3、遍歷數組中的每個元素。

        # awk 'BEGIN{jiaotong["a"]="huoche";jiaotong["b"]="feiji";jiaotong["3"]="qiche";print jiaotong["3"];for(i in jiaotong)print jiaotong[i]}'

          qiche

          huoche

          feiji

          qiche

          [root@centos7 Desktop]# 

 

       4、查看文件中每行重復出現的次數。

          [root@centos7 ~]# awk '{!stat[$0]++}END{for(i in stat)print i,stat[i]}' f1

            aaaa 2

            11111111 2

            bbbbbbbbbb 2

            cmslcml, 1

            [root@centos7 ~]#

       

            [root@centos7 ~]# cat f1 |uniq -c

            2 aaaa

            2 bbbbbbbbbb

            2 11111111

            1 cmslcml,

            [root@centos7 ~]#

  

       5、查看/var/log/httpd/access_log文件中IP地址鏈接的次數。

          [root@centos6 Desktop]# awk '{stat[$1]++}END{for(i in stat)print i,stat[i]}'    /var/log/httpd/access_log

          10.1.252.238 3

          [root@centos6 Desktop]#

 

             awk '{line[$0]++}END{for(i in line)print i ,line[i]}'  /etc/fstab

 

awk 函數:

數值處理:

    rand():返回01之間一個隨機數;

   srand():隨機數種子;

    int:整數;

     示例:

       1、生成5100以內隨機的5個整數;

         [root@centos7 ~]# awk 'BEGIN{srand();for(i=1;i<=5;i++)print int(rand()*100)}'

         26

         50

         21

         95

         59

           [root@centos7 ~]#

 

   length():返回指定字符串的長度。

   subr,s):搜索r表示的模式匹配的內容,并將第一個匹配的內容替換為s。

     示例:sub只替換搜索到的第一個匹配的內容。

       [root@centos7 ~]# echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-")'

       2008-08:08 08:08:08

       [root@centos7 ~]#

   gsubrs):搜索r表示的模式匹配的內容,并全部替換為s所表示的內容。

      示例:

       [root@centos7 ~]# echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-")'

        2008-08-08 08-08-08

        [root@centos7 ~]#

   splits,array,“r”):以r代表分隔符,切割字符s,并將切割后的結果保存至array所表示的數組中,第一個索引值為1,第二個索引值為2………

    示例:

    [root@centos7 ~]# echo "2008:08:08 08:08:08" | awk 'split($0,num,":"){print num[1]}'

    2008

    [root@centos7 ~]# echo "2008:08:08 08:08:08" | awk 'split($0,num,":"){print num[3]}'

    08 08

    [root@centos7 ~]#

   

    # netstat -tan | awk '/^tcp/{split($5,ip,":");print ip[1];counts[ip[1]]++}END{for(i in counts){print i ,counts[i] }}'

 

awk中調用shell命令:

     system命令:

        空格是awk中的字符串鏈接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說除了awk的變量外其他一律用“”應用起來。

        示例:

          [root@centos7 ~]# awk 'BEGIN{system("hostname")}'

            centos7

            [root@centos7 ~]# awk 'BEGIN{test=100;system("echo " test)}'

            100

            [root@centos7 ~]#

 

awk腳本:

awk程序寫成腳本,直接調用執行。

       [root@centos7 bin]# cat uid.awk

       #!/bin/awk -f

       #this is a awk scripts

 

     {if($3>=1000)print $1,$3}

     [root@centos7 bin]# uid.awk -F: /etc/passwd

     nfsnobody 65534

     zheng 1000

     yibo 1001

     mage 1002

     [root@centos7 bin]#

 

awk腳本中傳遞參數:

      [root@centos7 bin]# cat uid.awk

      #!/bin/awk -f

      #this is a awk scripts

 

      {if($3>=min && $3<=max)print $1,$3}

      [root@centos7 bin]# uid.awk -F: min=100 max=200 /etc/passwd

      usbmuxd 113

      rtkit 172

      qemu 107

      abrt 173

      avahi-autoipd 170

      pulse 171

      [root@centos7 bin]#

 

練習:

  1、統計/etc/fstab文件中每個單詞出現的次數:

      [root@centos7 bin]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstab  

 

  2、統計/etc/fstab文件中每個文件系統類型出現的次數:

     [root@centos7 bin]# awk '/^UUID/{fs[$3]++}END{for(i in fs)print i,fs[i]}' /etc/fstab

      swap 1

      xfs 3

      [root@centos7 bin]#

  

 

 

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

       

 

           

 

 

 

 

 

 

 

 

       示例:

        使用awk的“-F”選項指明以“:”作為列分隔符,取出/etc/passwd中第一個字段

          [root@centos6 ~]# awk -F: '{print $1}' /etc/passwd

          root

          bin

          daemon

          adm

          lp

          ……………………………….

          [root@centos6 ~]#

        使用awk的“-v”選項指明以“:”作為列分隔符,取出/etc/passwd中第一個字段

          [root@centos6 ~]# awk -v FS=":" '{print $1}' /etc/passwd

          root

          bin

          daemon

          adm

          lp

          ……………………………….

          [root@centos6 ~]#

         使用awk的“-v”選項指明以“:”作為列分隔符,輸出時指定以“=”作為列分隔符,取出/etc/passwd中第一、第三、第六個字段等。

         [root@centos6 ~]# awk -v FS=":" -v OFS="=" '{print $1,$3,$6}' /etc/passwd

         root=0=/root

         bin=1=/bin

         daemon=2=/sbin

         adm=3=/var/adm

         lp=4=/var/spool/lpd

         ……………………………….

         [root@centos6 ~]#

      示例:

      RS指明行的換行分隔符,指定輸入時的換行符,原換行符仍有效。

          [root@centos6 ~]# awk -v RS=" "  '{print}' /etc/passwd

          root:x:0:0:root:/root:/bin/bash

          shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

          games:x:12:100:games:/usr/games:/sbin/nologin

          gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

          ftp:x:14:50:FTP

          User:/var/ftp:/sbin/nologin

          ……………………………….

          [root@centos6 ~]#

 

 

 

 

 

 

 

 

 

 

原創文章,作者:zhengyibo,如若轉載,請注明出處:http://www.www58058.com/49777

(0)
zhengyibozhengyibo
上一篇 2016-09-30
下一篇 2016-10-01

相關推薦

  • socket阻塞與非阻塞,同步與異步、I/O模型

    1. 概念理解      在進行網絡編程時,我們常常見到同步(Sync)/異步(Async),阻塞(Block)/非阻塞(Unblock)四種調用方式:同步:      所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。也就是必須一件一件事做,等前…

    Linux干貨 2015-04-10
  • 設計模式 ( 十八 ) 策略模式Strategy(對象行為型)

    設計模式 ( 十八 ) 策略模式Strategy(對象行為型) 1.概述         在軟件開發中也常常遇到類似的情況,實現某一個功能有多種算法或者策略,我們可以根據環境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找、排序等,一種常用的方法是硬編碼(Hard Coding)在一個類中,如需要提供多種查找算…

    Linux干貨 2015-07-28
  • 設計模式(二)單件模式Singleton(創建型)

      幾乎所有面向對象的程序中,總有一些類的對象需要是唯一的,例如,通過數據庫句柄到數據庫的連接是獨占的。您希望在應用程序中共享數據庫句柄,因為在保持連接打開或關閉時,它是一種開銷。再如大家最經常用的IM,如QQ,在同一臺電腦,一個帳號只能有唯一的登錄。 1. 問題 怎樣確保一個特殊類的實例是獨一無二的(它是這個類的唯一實例),并且這個實例…

    Linux干貨 2015-06-24
  • Mysql 報錯解決–PID file could not be found!

    今天想把之前在cetnos6上編譯安裝的mariadb改下PATH環境變量,操作幾次之后,關閉或重啟mysql就失敗了,提示如下: [root@web1 ~]# service mysqld stop MySQL server PID file could not&nb…

    系統運維 2016-09-19
  • httpd服務歸納:淺談I/O模型

    1. 四種理論的I/O模型      1) 調用者(服務進程):         阻塞:  進程發起I/O調用,如果調用為完成,進程被掛起休眠,不能再執行其他功能    …

    Linux干貨 2015-05-27
  • linux文件系統

    linux的文件系統:             根文件系統為rootfs(root file system)           &nbsp…

    Linux干貨 2015-12-19
欧美性久久久久