awk學習筆記

一、linux的文本處理器三劍客

  文本過濾器:grep、egrep、fgrep

  行編輯器:sed(模式空間;保持空間)

  報表生成器:awk(格式化文本輸出)gawk

awk的工作流程:

從文本中讀取一行內容,根據指定的分隔符;將讀入的一行內容分隔成字段,然后格式化輸出指定的字段

1.png

二、awk的命令相關的參數及用法

  1、基本用法:

awk [options]  'program' file1,file2,.....
  options常用選項:
       -F[]:指定分隔符,使用[]可以指定多個分隔符
       -v var=varl:變量賦值
  program組成:
      PATTERN {ACTION STATEMENT},由語句組成,語句分隔符是";"
      ACTION:print,printf

例:使用awk對/etc/paswd文件進行編輯,賦值給變量test,利用-F指定分隔符":",使用print打印出指定內容

2.png

 2、awk的常用輸出命令:print

   用法:print  item1,item2,….

 注意要點:

  ①各item直接使用逗號分隔,而輸出時則使用輸出分隔符進行分隔

  ②輸出時各item可以是字符串或數值、當前記錄的字段($n)、變量或awk的表達式;數值會被隱式轉換字符輸出   ③print的item如果省略,相當于print $0,若輸出“空白”,則使用print "";

 3、awk變量

內置變量:
    FS: input field separator;輸入分隔符,默認為空白字符
    RS: input record separator;輸入換行符,默認為空白字符
    OFS: output field separator;輸出分隔符,默認為空白字符
    ORS: output record separator;輸出換行符,默認為空白字符
    NF: 當前行的字段數
    NR: 行數,所有文件統一計數
    FNR: 行數,各文件分別計數
    FILENAME: 當前文件名
    ARGC: 命令行的參數的個數
    ARGV: 數組,保存命令行的所有參數

自定義變量:
 -v VAR=VAL
  定義變量的位置:
   可以在program中定義
     可以使用-v 定義

  例1:利用FS,RS,OFS,ORS,對/etc/passwd進行文本處理

3.png

 例2:統計當前行的字段數

  4.png

  例3:統計文件的行數:

  5.png

  6.png

   例4:統計命令的個數和數組

  7.png

  8.png

  例5:自定義變量

  9.png

4、printf命令:

格式: printf format item1,item2,....
  注意要點:
     1) format是必須的
     2)不會自動換行,需顯示給定換行符
     3)format中需要分別為后面的每個item指定一個格式符

格式符:都以%開始,后面跟一個字符
    %c: 顯示字符的ASCII碼
    %d,%i: 顯示十進制整數
    %e,%E:以科學計數法顯示數值
    %f:顯示浮點數
    %g,%G:以科學計數法格式或浮點數格式顯示數值
    %s:字符串
    %u:無符號的整數
    %%:顯示%自身
 
 修飾符:
    #[.#]: 第一個#顯示字符寬度,例如%20s;第二個#表示小數點后的精度
    -:左對齊
    +:顯示數值符號
    
 操作符:
    算術運算操作符:
       x+y, x-y, x*y, x/y, x^y, x%y
       -x: 負值
       +x: 轉換為數值
  
    字符串操作符:字符串連接
  
    賦值操作符:
       =, +=, -=, *=, %=, /=, ^=, ++, --
      
    比較操作符:
       <, >, <=, =>, ==, !=
         
    模式匹配符:
      ~ ,!~
      
    邏輯操作符:
         &&   || 
         
    條件表達式:
         selector? if-true-expression:if-false-expression
     
     函數調用:
         function_name (argu1,argu2,...)

   例1:格式符

 0.png

   例2:條件表達式

11.png

 5、PATTERN:

   1)/regular expression/:進出了能夠被/regluar expression/匹配到的行

   12.png

   2)relational expression:關系表達式,有真假之分,一般來說,其結果為非0或非空字符串時為"真",否則為"假"

  13.png

  3)line ranges: 行范圍,類似sed或vim的地址定界法:startline,endline

  14.png

  4)BEGIN/END:特殊模式,僅在awk運行程序之前執行一次BEGIN或僅在awk運行程序后執行一次END    15.png

  5)empty:空模式,任意匹配

  16.png

 6、常用的action:

Expression
Control statements
Compound statements
input statemenets
output statements

 7、控制語句:

   1)if語句:對awk取得的整行或行中的字段做條件判斷
       語法:if (condition) statement [else statement]
             if (condition) {statement; [else {statement};]
  例:
awk -F: '{if (($3)>=500) {print $1,"is command user"} else{print $1,"is admin user."}}' /etc/passwd
   2)while循環:通常在當前行的字段間進行循環
       語法:while (condition)  statement
              while  (condition)  {statement}
  例:# awk  '{i=1;while(i<=NF){printf "%20s:%s\n",$i,length($i);i++}}'  /etc/issue
              CentOS:6
             release:7
                 6.6:3
              Kernel:6
                  \r:2
                  on:2
                  an:2
                  \m:2
   3)do-while循環:至少執行一次循環體
         語法:do statement  while (condition)
            do {do-while-body} while (condition)
   4)for循環:
      語法: for (expr1;expr2;expr3) statement
          for (expr1;expr2;expr3) {statement}
     例:#awk '{for (i=1;i<=NF;i++) {printf "%s:%d\n",$2,length($i)}}' /etc/issue
          release:6
          release:7
          release:3
          release:7
          \r:6
          \r:2
          \r:2
          \r:2
          \r:2
         
         for 循環在awk中有一個功能專用于遍歷數組元素
             語法:for (var in arry)  {for-body}
   5)swithc:是gawk特有的,awk沒有此功能
   語法:switch (expression) {case VALUE or /REGEXP/:statement;.......;default:statementN}
   6)break and continue
     break[n]: 退出內存[n]循環
     continue[n]: 提前結束本輪循環,直接進入下輪循環
   7)netx:提前結束對本行的處理,而進入下一行的處理
     例:# awk '{if (NF%2!=0) next; {print $0}}' /etc/issue
      CentOS release 6.6 (Final)
   8)arry數組:
    關聯數組:arry[index-expression],其中index-expression可以使用任意字符;
    如果某數組元素事先不存在,在引用時,awk會自動創建此元素,將其初時為空串
    ;因此如果要判斷數組中是否存在某元素,要使用"index in arry" 進行
    要遍歷數組中的每個元素,使用: for (var in arry) {for body}
   注意:var會遍歷arry的每一個索引,print arry[var]
   例:統計netstat中各狀態各出現多少次
    # netstat -tan | awk '/^tcp/{state[$NF]++}END{for (i in state){print i,state[i]}}'
     ESTABLISHED 1
     LISTEN 28
   9)函數
    (1)內置函數
     數值處理:
        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表示的數組中
       substr(s,i,[,n]):從s表示的字符串中取字串,從i開始,去n個字符
             
     時間函數:
      systime():取時間戳
       # awk 'BEGIN{print systime()}'
       1434125151          
                    
       位運行函數:
       and(v1,v2)
                 
   (2)自定義函數:
     funciton f_name(p,q)
       {
       ...............
       }

原創文章,作者:馬行空,如若轉載,請注明出處:http://www.www58058.com/5328

(0)
馬行空馬行空
上一篇 2015-06-23 09:57
下一篇 2015-06-23

相關推薦

  • Gitlab代碼管理倉庫安裝部署

    GitLab是利用 Ruby on Rails一個開源的版本管理系統,實現一個自托管的Git項目倉庫,可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能,能夠瀏覽源代碼,管理缺陷和注釋。可以管理團隊對倉庫的訪問,它非常易于瀏覽提交過的版本并提供一個文件歷史庫。它還提供一個代碼片段收集功能可以輕松實現代碼復用,便于日后有需要的時候進行查…

    2016-07-26
  • linux一周學習總結

          對于linux,之前也完全沒有接觸過,完全零基礎小白。來到馬哥以后,進入學習也有一周時間 ,一周里老師帶我們學習了很多指令,下面,我就自己的理解和老師講授的內容對linux中的一些指令做一個簡單的小總結。 一、關于SHELL Shell     查詢當前系統使用了哪個shell   &n…

    2017-07-15
  • 【招聘】天津/贊普科技股份有限公司/Linux系統運維工程師/6-7k/五險一金

    天津贊普科技股份有限公司——簡稱贊普科技,成立于2003年,坐落于天津市濱海高新區,是一家專業的互聯網綜合服務商,主營數字網絡建設、數據接入及增值服務和智能化網絡產品及服務。歷經11年的發展,贊普科技已成長為高新區科技型小巨人企業、國家高新技術企業,專注于移動互聯與大數據、云計算、商業WIFI行業的領軍者。     贊普科技計劃…

    Linux干貨 2015-12-03
  • 使用monit搭建一個監控系統

     上周用monit搭建或者說定制了一個監控系統,來監控服務器發生事情。當然了主要是監控異常,因為我們的產品屬于服務器類型,很多進程都daemon,要不停的運行。我們搭建監控目的不過是出現問題能夠及時的知道,平時可從web UI上看到整個系統的狀況,同時它本身要輕量級,不要影響性能。當然了類似的產品很多了,比如Ganglia,我在老科長波哥曾經搭建過…

    Linux干貨 2015-02-15
  • VMware虛擬機設置網絡(包含簡單安裝)

    1.下載VMware虛擬機 2.創建一個虛擬機,選擇下載好的linux系統,我這里選擇的是CentOS版本,之后一直按著步驟設置一般都選擇默認就好                               &…

    2017-09-02
欧美性久久久久