AWK 的用法

目錄: 
一、概述 
二、awk基本語法格式 
三、awk基本操作 
四、awk條件及循環語句 
五、awk函數 
六、awk演示示例(源自于man手冊)

一、概述

  1. 產品概述: 
    awk是一種編程語言,用于在linux/unix下對文本和數據進行掃描與處理。數據可以來自標準輸入、文件、管道。 
    awk分別代表其作者姓氏的第一個字母。因為它的作者是三個人,分別是Alfred Aho、Peter Weinberger、Brian Kernighan。 
    實際上awk有很多種版本,如:awk、nawk、mawk、gawk、MKS awk、tawk… 這其中有開源產品也有商業產品。 
    目前在Linux中常用的awk編譯器版本有mawk,gawk,其中以RedHat為代表使用的是gawk,以Ubuntu為代表使用的是mawk。 
    gawk是GNU Project 的awk解釋器的開源代碼實現。 
    本文將以gawk作為講解工具。
  2. 原理: 
    1). awk逐行掃描文件,從第一行到最后一行,尋找匹配特定模式的行,并在這些行上進行你想要的操作。 
    2). awk基本結構包括模式匹配(用于找到要處理的行)和處理過程(即處理動作)。 
    pattern {action} 
    # 提示:awk讀取文件內容的每一行時,將對比改行是否與給定的模式相匹配,如果匹配則執行處理過程,否則對該行不做任何處理。 
    如果沒有指定處理腳本,則把匹配的行顯示到標準輸出,即默認處理動作是print打印行; 
    如果沒有指定模式匹配,則默認匹配所有數據。 
    3). awk有兩個特殊的模式:BEGIN和END,他們被放置在沒有讀取任何數據之前以及在所有數據讀取完成以后執行。 
    二、awk基本語法格式
  3. 格式: 
    gawk [ POSIX or GNU style options ] -f program-file [ – ] file … 
    注釋:POSIX or GNU style options表示gawk支持POSIX以及GNU兩種選項;-f后接腳本文件;file表示準備處理的文檔名稱。
  4. gawk支持以下選項: 
    -F fs 
    –field-separator fs 
    指定以fs作為輸入行的分隔符(默認分隔符為空格或制表符) 
    -v var=val 
    –assign var=val 
    在執行處理過程以前,設置一個變量var值為val 
    -f program-file 
    –file program-file 
    從腳本文件中讀取AWK指令,以取代在命令參數中輸入處理腳本 
    -W compat 
    -W traditional 
    –compat 
    –traditional 
    使用兼容模式運行awk,GNU擴展選項將被忽略 
    -W copyleft 
    -W copyright 
    –copyleft 
    –copyright 
    輸出簡短的GNU版權信息 
    -W dump-variables[=file] 
    –dump-variables[=file] 
    打印全局變量(變量名、類型、值)到文件中,如果沒有提供文件名,則自動輸出至名為dump-variables的文件中。 
    示例:[jacob@localhost ~]# awk -W dump-variables=out.txt ‘x=1 {print x}’ test.txt 
    -W exec file 
    –exec file 
    類似于-f選項,但腳本文件需要以#!開頭;另外命令行的變量將不再生效 
    -W help 
    -W usage 
    –help 
    –usage 
    顯示各個選項的簡短描述
  5. awk程序結構 
    一個awk程序包含一系列的 模式 {動作指令} 或是函數定義。 
    模式可以是: 
    BEGIN 
    END 
    表達式 
    表達式,表達式 
    動作指令需要以{}引起來
  6. 簡單示例:
[jacob@localhost ~]# awk '/^$/  {print  "Blank line}' test.txt 

三、awk基本操作

  1. 記錄與字段 
    awk一次從文件中讀取一條記錄,并將記錄存儲在字段變量中。記錄被分割為字段并存儲在1,NF中(默認使用空格或制表符為分隔符)。 
    內建變量NF為記錄的字段個數 
    示例:
[jacob@localhost ~]# echo  hello the world | >awk '{print $1,$2,$3}' 備注:讀取輸入行并輸出第一個字段,第二個字段,第三個字段。
    [jacob@localhost ~]# echo  hello the world | >awk '{print $0}' 備注:讀取輸入行并輸出該行。
    [jacob@localhost ~]# echo  hello the world | >awk '{print  NF}' 備注:讀取輸入行并輸出該行的字段個數:3個字段。
    [jacob@localhost ~]# echo  hello the world | >awk '{print $NF}' 備注:讀取輸入行并輸出該行的第三個字段,因為NF為3,所以$NF等同于取行的最后一個字段。
  1. 字段分隔符 
    默認awk讀取數據以空格或制表符作為分隔符,但可以通過-F或FS(field separator)變量來改變分隔符。 
    示例:
[jacob@localhost ~]# awk  -F:  '{print $1}'  /etc/passwd
    [jacob@localhost ~]# awk 'BEGIN {FS = ":"} {print $1}'  /etc/passwd
    備注:以上兩個示例均將字段的分隔符改冒號(:),即以冒號為分隔符打印passwd文件的第一個字段(帳號名稱)。
    注意:如果使用FS改變分隔符的話,需要在BEGIN處定義FS,因為在讀取第一行前就需要改變字段分隔符。
    進階:指定多個字段分隔符(文檔內容為:hello the:word,!)
     [jacob@localhost ~]# echo 'hello the:word,!' |
     >awk 'BEGIN {FS="[:, ]"}  {print $1,$2,$3,$4}'
3. 內置變量
以下為awk內置變量:
      ARGC        命令行參數個數
      FILENAME    當前輸入文檔的名稱
      FNR        當前輸入文檔的當前記錄編號,尤其當有多個輸入文檔時有用
      NR        輸入流的當前記錄編號
      NF        當前記錄的字段個數
      FS        字段分隔符
      OFS        輸出字段分隔符,默認為空格
      ORS        輸出記錄分隔符,默認為換行符\n RS     輸入記錄分隔符,默認為換行符\n 
  1. 表達式與操作符 
    表達式是由變量、常量、函數、正則表達式、操作符組成,awk中變量有字符變量和數字變量。如果在awk中定義的變量沒有初始化,則初始值為空字串或0。 
    注意:字符操作時一定記得需要加引號 
    1) 變量定義示例: 
    a=”welcome to beijing” 
    b=12 
    2) 操作符(awk操作符與C語言類似) 

    • 乘 
      / 除 
      % 取余 
      ^ 冪運算 
      ++ 自加1 
      – 自減1 
      += 相加后賦值給變量(x+=9等同于x=x+9) 
      -= 相減后賦值給變量(x-=9等同于x=x-9) 
      = 相乘后賦值給變量(x=9等同于x=x*9) 
      /= 相除后賦值給變量(x/=9等同于x=x/9) 
      < 小于 

      大于 <br> 

      = 大于等于 
      <= 小于等于 
      == 等于 
      != 不等于 
      ~ 匹配 
      !~ 不匹配 
      && 與 
      || 或 
      操作符簡單示例: 
      [jacob@localhost ~]# echo “test” | awk ‘x=2 {print x+3}’ 
      [jacob@localhost ~]# echo “test” | awk ‘x=2,y=3 {print x*2, y*3}’ 
      [jacob@localhost ~]# awk ‘/^/ {print x+=1}’   test.txt        備注:統計所有空白行  
        [jacob@localhost ~]# awk  ‘/^
      / {x+=1} END {print x}’ test.txt 備注:打印總空白行個數 
      [jacob@localhost ~]# awk -F: ‘1~/root/   {print3}’ /etc/passwd 備注:打印root的ID號 
      [jacob@localhost ~]# awk -F: ‘3>500  {print1}’ /etc/passwd 備注:列出計算機中ID號大于500的用戶名

四、awk條件及循環語句 
1. IF條件判斷格式: 
if (表達式) 
動作1 
else 
動作2 
或者if (表達式) 動作1;else 動作2 
說明:如果表達式的判斷結果為真則執行動作1,否則執行動作2。 
示例:(判斷boot分區可用容量小于20M時報警,否則顯示OK) 
[jacob@localhost ~]# df |grep “boot” |awk ‘{if($4<20000) print “Alart”; else print “OK”}’ 

  1. 循環 
    while (條件) 
    動作 
    x=1 
    while (i < 10) { 
    print $i 

    示例: 
    [jacob@localhost ~]# awk ‘i=1 {} BEGIN { while (i<=10) {++i; print i}}’ test.txt

    do 
    動作 
    while (條件) 
    示例: 
    [jacob@localhost ~]# awk ‘BEGIN { do {++x;print x} while (x<=10)}’ test.txt 
    for (變量;條件;計數器) 
    動作 
    示例: 
    for (i=1;i<=10;i++) 
    print i 
    [jacob@localhost ~]# awk ‘BEGIN {for(i=1;i<=10;i++) print i}’ test.txt 
    [jacob@localhost ~]# awk ‘BEGIN {for(i=10;i>=1;i–) print i}’ test.txt 
    說明:因為以上循環語句使用的awk均使用的BEGIN模式,所以輸入文檔可以為任意文檔(無關緊要)。

    1. Break與Continue 
      break 跳出循環 
      continue 終止當前循環 
      示例: 
      for (i=1; i<=10;i++) { 
      if (i=5) 
      continue 
      print i 

      說明:打印1-4,6-10 
      for (i=1; i<=10;i++) { 
      if (i=5) 
      break 
      print i 

      說明:僅打印1-4

五、函數 
1. rand () 產生0-1之間的浮動類型的隨機數 
備注:rand產生隨機數時需要通過srand()設置一個參數,否則單獨的rand()每次刪除的隨機數都是一樣的。 
示例: 
[jacob@localhost ~]# awk ‘BEGIN {print rand(); srand(); print srand()}’ test.txt 
2. gsub(x,y,z) 在字串z中使用字串y替換與正則表達式x相匹配的所有字串,z默認為在字串中使用字串替換與正則表達式相匹配的第一個字串,默認為0 
示例: 
[jacob@localhost ~]# awk -F: ‘gsub(/root/,”jacob”,0) {print0}’ /etc/passwd 備注:將passwd每行中所有的root修改為jacob顯示至屏幕 
[jacob@localhost ~]# awk -F: ‘sub(/root/,”jacob”,0) {print0}’ /etc/passwd 備注:將passwd每行中第一個root修改為jacob顯示至屏幕 
sub相當于sed中的s///,gsub相當于sed中的s///g。 
3. length(z) 返回字串z的長度 
示例: 
[jacob@localhost ~]# awk ‘{print length()}’ test.txt 備注:顯示test.txt文檔每行的字符長度 
4. gentline 從輸入中讀取下一行內容

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

(0)
huchaoweihuchaowei
上一篇 2017-05-30
下一篇 2017-05-30

相關推薦

  • 用戶和組相關配置文件

    1. /etc/passwd文件詳解 輸入vi /etc/passwd 可以查看此文件的內容 [root@localhost ~]# vi /etc/passwdroot:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/…

    Linux干貨 2016-10-23
  • glob及IO重定向

    globbing: 文件名通配     匹配模式:元字符           *:匹配任意長度的任意字符    pa* ,*pa* ,*pa,  *p*a*    pa, paa, passwd    ?:  …

    Linux干貨 2016-12-21
  • 魔術方法

    Edit 魔術方法 使用Python的魔術方法的最大優勢在于他們提供了一種簡單的方法來讓對象可以表現的像內置類型一樣。那意味著你可以避免丑陋的,違反直覺的,不標準的的操作方法。 特殊屬性 屬性 含義 __name__ 類、函數、方法等名字 __module__ 類定義所在的模塊名? __class__ 對象或類所屬的類 __bases__ 類的基類的元組,順…

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

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

    Linux干貨 2016-08-02
  • 第三周n28

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 who | cut -d ” ” -f 1 | sort -u 2、取出最后登錄到當前系統的用戶的相關信息。 who | tail -1 3、取出當前系統上被用戶當作其默認shell的最多的那個shell。 cat /etc/passwd | …

    Linux干貨 2017-12-17
  • 馬哥教育網絡20期+第7周練習博客

    1、創建一個10G分區,并格式為ext4文件系統;    (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;    (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; [root@7b ~]#&nbsp…

    Linux干貨 2016-07-24
欧美性久久久久