awk

文本處理工具

  • 文本處理三工具:grep,sed,awk

    • grep,egrep,fgrep:文本過濾工具
    • sed:行編輯器
    • awk:報告生成器,格式化文本輸出;

awk

  • gawk – pattern scanning and processing language

    lrwxrwxrwx. 1 root root 4 May 17 19:23 /bin/awk -> gawk

  • 基本用法:gawk [ options ] -f ‘program’ FILE …

    • program:PATTERN{ACTION STATEMENTS};語句之間用分號分隔;

      • print,printf
    • options:

      • -F:指明輸入時用到的字段分隔符;默認為空白字符;
      • -v:var=value:自定義變量

print

  • print item1,item2,…
  • 要點:

    1. 逗號分隔符;
    2. 輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式;
    3. 如省略item,相當于:print $0

變量

  • 內建變量

    • FS:input field seperator,默認為空白字符;
    • OFS:output field seperator,默認為空白字符;
    • RS:input record seperator,輸入時的換行符;
    • ORS:output record seperator,輸出時的換行符;

      ~]# awk -v FS=':' '{print $1}' /etc/passwd
      ~]# awk -F: '{print $1}' /etc/passwd
    • NF:number of field,字段數量;
      {print NF},{print $NF}
    • NR:number of record,行數;
    • FNR:各文件分別計數,行數;
    • FILENAME:當前正在處理的文件名;
    • ARGC:命令行參數的個數;
    • ARGV:數組,保存的是命令行所給定的各參數;
  • 自定義變量

    • -v var=value
      變量名區分字符大小寫;
    • 在program中直接定義

printf

  • 格式化輸出:printf FORMAT,item1,item2, …

    • FORMAT必須給出;
    • 不會自動換行,需要顯式給出換行控制符,\n
    • FORMAT中需要分別為后面的每個item指定一個格式化符號;使用“” ;

      • 格式符:
        %c:顯示字符的ASCII碼
        %d,%i:顯示十進制整數;
        %e,%E:科學計數法數值顯示;
        %f:顯示為浮點數;
        %g,%G:以科學計數法或浮點形式顯示數值;
        %s:顯示字符串;
        %u:無符號整數;
        %%:顯示%自身;
      • 修飾符:冒號分隔

        #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度;
          awk -F: '{printf "username: %15s,Uid: %d\n",$1,$3}' /etc/passwd
              username:后面的數字寬度為15個字符;
              默認右對齊;
        
        -:表示左對齊
        awk -F: '{printf "username: %-15s,Uid: %d\n",$1,$3}' /etc/passwd
        username:后的內容左對齊;
        
        +:顯示數值的符號;

操作符

  • 算術運算操作符:

    • x+y,x-y,x*y,x/y,x^y,x%y
    • -x:把一個整數轉變成一個負數
    • +x:把一個字符串轉化為數值
  • 字符串操作符:沒有符號的操作符,字符串連接
  • 賦值操作符:
    =,+=,-=,*=,/=,%=,^=
    ++ 自加,– 自減
  • 比較操作符:
    >,>=,<,<=,!=,==
  • 模式匹配符
    ~ 是否匹配
    !~ 是否不匹配
  • 邏輯操作符
    && 與
    || 或
    ! 不等于
  • 函數調用
    Function_name(argu1,argu2,……)
  • 條件表達式
    Selector?if-true-expression:if-false-expression

    ~]# awk -F: '{$3>=1000?usertype="common user":usertype="systemuser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

PATTERN

  • empty:空模式,匹配每一行;
  • /regular expression/:僅處理能夠被此處的模式所匹配到的行;
  • relational expression:關系表達式;結果有“真”有“假”;結果為“真”才會被處理;

    • 真:結果為非0值,非空字符串;
    ~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
    root /bin/bash
    magedu /bin/bash
    ~]# awk -F: '$NF~/bash/{print $1,$NF}' /etc/passwd
    root /bin/bash
    magedu /bin/bash
  • line ranges:行范圍

    • startline,endline:/pat1/,/pat2/
    • 不支持直接給出數字的格式
      ~]# awk -F: ‘(MR>=2&&NR<=10){print $1}’ /etc/passwd
  • BEGIN/END 模式

    • BEGIN{}:僅在開始處理文件中的文本之前執行一次的程序
      BEGIN可以打印表頭
    • END{}:僅在文本處理完成之后,命令結束之前,執行一次的程序
      可以顯示最后的結果

常用的action

  • Expressions:算術,比較表達式 a>b等等
  • Control statements:if、while等
  • Compound statements:組合語句,將多個語句當做一個代碼塊的用法
  • Input statements:輸入語句
  • Output statements:輸出語句,print

控制語句

  • If(condition) {statements} else {statements}
    While (condition) {statements}
    Do {statements} while (condition)
    For (expr1;expr2;expr3) {statements}
    Break
    Continue
    Delete array[index]
    Delete array
    Exit
    {compound statements}

  • if-else

    • 語法:If(condition) {statement} else {statements}

      • If(condition) statements

        ~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
        ~]# awk '{if(NF>5) print $0}' /etc/fstab
      • If(condition) {statements} else {statements2}

        ~]# awk -F: '{if($3>=1000) {printf "common user: %s\n",$1} else {printf "root or sysuser: %s\n",$1}}' /etc/passwd
      • If(condition) {statements} else if (condition2) {statements2} else {statements3}
    • 使用場景:對awk取得的整行或某個字段做條件判斷;

  • While循環

    • 語法:while(condition) statement
      條件為“真” ,進入循環;條件為“假”,退出循環;有可能不被執行(如第一次判斷為假)

      ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg
      
      當length大于7時顯示:
      ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
    • 使用場景:對一行內的多個字段逐一進行類似處理的時候;對數組中各元素逐一處理時使用
  • Do-while 循環

    • 語法:do {statement} while(condition)
      意義:無論真假,至少執行一次循環體

      ~]# awk 'BEGIN{ total=0;i=0;do{total+=i;i++;}while(i<=100);print total}'
      5050
  • For 循環

    • 語法:for(expr1;expr2;expr3) {statement}
      詳細語法:For(variable assignment;condition;iteration process) {for-body}

      ~]# awk '/^[[:space:]]*linux16/ {for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
    • 特殊用法:

      • 遍歷數組中的所有元素
        語法:for(var in array) {for-body}
  • Switch 語句

    • 語法:Switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement ; …… ;default: statement}
  • break和continue

    • continue,退出本輪循環,直接進入下一輪;

      ~]# awk 'BEGIN{sum=0;for(a=1;a<=100;a++){if(a%2==0){continue}sum+=a} print sum}'
      2500
    • break [n],退出循環

      ~]# awk 'BEGIN{sum=0;for(a=1;a<=100;a++){if(a==66){break}sum+=a}print sum}'
      2145
  • next

    • 提前結束對本行的處理而直接進入下一行;

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

array

  • 關聯數組:array[index-expression]

    • Index-expression

      1. 可以使用任何字符串,字符串使用引號(必須加雙引號)
      2. 如果某數組元素事先不存在,在引用時,awk 會自動創建元素,并將其值初始化為空值
      • 若要判斷數組中,是否存在某元素,要使用“index in array”格式進行

        ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["tue"]}'
      • 若要遍歷數組中每個元素,則要使用 for 循環;
        for(var in array){for-body}

        ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) print weekdays[i]}'
        
        注意:var會遍歷array的每個索引;當索引++時會統計數組中的索引個數;
        ~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) {print i,state[i]}}'
        ~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
        
        增加訪問量:
        ab -c 100 -n 1000 http://172.16.100.9/index.html
        
        統計/etc/fstab文件中每個文件系統類型出現的次數;
        ~]# awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab 
        
        統計指定文件中每個單詞出現的次數;
        ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab

函數

  • 內置函數

    • 數值處理:rand():返回0和1之間一個隨機數
    • 字符串處理:

      • length([s]):返回指定字符串的長度;
      • sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其第一次出現替換為s所表示的內容;
      • gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其所有出現均替換為s所表示的內容;
      • split(s,a,[r]):以r為分隔符切割字符s,并將切割后的結果保存至a所表示的數組中;

        ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count) {print i,count[i]}}'
  • 自定義函數

    function f_name(p,q){
    
    ...
    }

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

(0)
ss
上一篇 2017-05-21 12:33
下一篇 2017-05-21

相關推薦

  • ssh 筆記

    ssh

    Linux干貨 2018-01-08
  • 8-8 sed 練習

    8-8 作業 1. 如何設置tab縮進為4個字符? 2. 復制/etc/rc.d/init.d/functions文件至/tmp目錄;替換/tmp/functions文件中的/etc/sysconfig/init為/var/log; 3. 刪除/tmp/functions文件中所有以#開頭,且#后面至少有一個空白字符的行的行首的#號;

    Linux干貨 2016-08-12
  • 磁盤及文件系統管理應用實例

    磁盤及文件系統管理應用實例 1.創建一個10G的分區,并格式化為ext4文件系統 要求其block大小為2048,預留空間百分比為2,卷標為MYDATA,默認掛載屬性包含acl 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳 [root@master ~]# fdisk /dev/sdb Command (m for…

    Linux干貨 2017-08-14
  • 馬哥教育網絡班21期+第10周課程練習

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) POST(Power On Self Test): 檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常。 加載BIOS(Basic Input and Output System): 根據在BIOS中設置的系統啟動順序來搜索用于啟動系統的驅動器(硬盤、光盤、U…

    Linux干貨 2016-09-08
  • Linux的文件系統架構基礎

    前言     當今計算機操作系統來說常見功能主要有:進程調度、內存管理、文件系統管理、網絡協議棧支持、驅動程序管理、安全功能等。所有對于我們來講學習Linux文件系統也是一個十分重要的知識,也是學習Linux的必備基礎知識,學習好Linux的文件系統知識也是為接下來學習Linux的其他知識奠定良好的基礎 關鍵詞  &n…

    Linux干貨 2015-04-16
欧美性久久久久