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 10:05

相關推薦

  • linux網絡管理

    Linux網絡配置 摘要:Linux 對網絡的管理分為 靜態指定和動態管理。 靜態指定 靜態指定ip一般有命令              ifconfig       &…

    Linux干貨 2016-04-05
  • Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

    Nginx基礎 前言 apache在設計的時候已經考慮了并發訪問模型,select()機制可以響應1024個訪問,但是當數量再大,千萬級別的時候http就響應不過來了。這個時候,nginx的出現解決了這一個問題。nginx是一個安裝簡單、配置文件簡單、占用內存少、穩定性高、處理并發能力非常強、靈活好用等有點聚集于一身的輕量級服務器。在Linux操作系統中,N…

    Linux干貨 2016-12-24
  • 馬哥網絡教育班第21期+第四周課程練習

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限 [root@CentOS6 ~]# cp -r /etc/skel /home/tuser1 [root@CentOS6 ~]# chmod&nb…

    Linux干貨 2016-07-29
  • lvm基本應用,擴展及縮減實現

    一、    LVM的創建     LVM因為他的可擴展和可伸縮的特性,被廣泛的應用于磁盤管理中,創建LVM則必須先創建pv然后創建vg最后才能創建lv,他們之間的關系如下:呈金字塔結構     1、創建查看pv     …

    Linux干貨 2016-03-09
  • for,while,until簡介

    Shell(以Bash為例)中的循環語句一般有for、while、until這幾種,偶爾還有寫錯語法的時候,這里結合實例來自己總結一下。也為今后使用提供一個快捷的資料獲取渠道。 一、for循環語句 實例1.1 最基本的for循環: (傳統的形式,for var in …) 代碼如下: #!/bin/bashfor x in one two three fou…

    Linux干貨 2016-08-22
  • 第四周(1):課堂練習與作業

    課堂練習: 1、刪除/etc/grub.conf文件中所有以空白開頭的行行首的空白字符 [root@centos6 ~]# sed 's@^[[:space:]]\+@@' /etc/grub.conf 2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符 …

    Linux干貨 2016-08-10
欧美性久久久久