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 16:01

相關推薦

  • puppet部署多臺服務器

    利用puppet實現自動化部署 配置前準備:   圖中:藍線表示各個服務器之間通信      紅線表示puppetmaster主機向各個agent主機部署信道 A主機puppet-master主機:192.168.126.129 B主機做兩種服務:keepalived高性能和nginx反代  &nb…

    2017-07-23
  • tar ,cpio打包解壓. shell腳本for,while,until循環. rpm包管理,循環的特殊用法. select循環菜單,函數function,rpm包查詢,yum

    tar  tar -cf 路徑+文件名字后續.tar  +路徑 創建歸檔壓縮 tar cf /testdir/etc.tar /etc/ tar cvf 可以查看解壓過程 tar tvf 預覽作用 tar xvf 解壓文件  tar zcvf /testdir/etc2.tar.gz /etc/ 解壓再壓縮到指定路徑,文件格式 …

    Linux干貨 2016-08-21
  • 馬哥教育網絡班21期第六周作業

    詳細總結VIM編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加# cp /etc/rc.d/rc.sysinit /tmp vim /tmp/rc.sysinit :%s/^[[:space:]]\+/#/…

    Linux干貨 2016-08-22
  • Btrfs文件系統

    btrfs文件系統特性: 1、多物理卷支持 Btrfs可由多個底層物理卷組成:支持raid,以聯機添加,移除,修改 2、寫時復制機制(cow) ????復制,更新及替換指針,而非就地更新。在文件進行修改的時候,首先將文件復制一份出來,在復制的文件中進行修改,修改完成后,將指向原有文件的指針指向到修改完成的文件上,若修改完成的文件出現錯誤,則我們可以通過源文件…

    2016-04-10
  • OpenSSL

    加密和解密技術 本章內容: 安全機制 對稱加密 不對稱加密 散列算法 PKI和CA 相關知識: 1)傳輸層協議:        TCP(面向連接),UDP(面向無連接),SCTP(流控協議) 2)port(端口):傳輸層協議都會提供端口,        端口(port)是標記進程…

    Linux干貨 2016-09-29
  • PHP的類自動加載機制

    在PHP開發過程中,如果希望從外部引入一個class,通常會使用include和require方法,去把定義這個class的文件包含進來。這個在小規模開發的時候,沒什么大問題。但在大型的開發項目中,這么做會產生大量的require或者include方法調用,這樣不因降低效率,而且使得代碼難以維護,況且require_once的代價很大。 在PHP5之前,各個…

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