天天看點

格式處理器--AWK

簡介:

grep、sed、awk為三個主流的文本處理器,但是在處理上各有優缺點。這裡我們隻介紹awk

          AWK是一種優良的文本處理工具。它不僅是 Linux 中也是任何環境中現有的功能最強大的資料處理引擎之一。這種程式設計及資料操作語言(其名稱得自于它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母)的最大功能取決于一個人所擁有的知識。AWK 提供了極其強大的功能:可以進行樣式裝入、流控制、數學運算符、程序控制語句甚至于内置的變量和函數。它具備了一個完整的語言所應具有的幾乎所有精美特性。實際上 AWK 的确擁有自己的語言:AWK 程式設計語言, 三位建立者已将它正式定義為“樣式掃描和處理語言”。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。

一、基本文法

  awk [options] ‘program’ file  file ..

  awk [options]   ‘PATTERN{action}’ file   file…

輸出格式:print item1,item2。。。

(1)各項之間用逗号分割,實作出來有空格;若用空格顯示出來則無空格

格式處理器--AWK

(2)輸出的各項可以字元串,目前記錄字段,變量或awk的表達式;數值會被隐式轉換為字元串後輸出

(3)如果後面的print後面的item省略,相當于print $0:輸出全部

格式處理器--AWK

===============================================================

二、awk的變量

       主要分為内置變量和自定義變量

(1)内置變量

FS:Filed Seperator 輸入時的字段分割fu
RS: 輸入行分割符
OFS 輸出時的字段分割符
ORS 輸出時的行分割符
NF 字段數
NR 行數,所有檔案一并計數
FNR 行數,各檔案分别計數
ARGV 數組儲存指令本身的字元
ARGC 儲存awk指令參數的個數
FILENAME awk正在處理的目前檔案的名稱

下面舉例顯示一下差別:

(a)使用不同的分割

格式處理器--AWK

(b)對檔案行數計數

格式處理器--AWK

(c)對各檔案分别計數

格式處理器--AWK

(d)使用數組儲存指令本事的字元

格式處理器--AWK

(e)儲存指令參數的個數

格式處理器--AWK

(f)顯示awk目前正在處理的檔案系統的名稱

格式處理器--AWK

(2)自定義變量

     -v   var_name=VALUE        //變量名區分字元大小寫

    a.可以在program中定義

    b.可以在指令行通過-v選項自定義

格式處理器--AWK

三、awk的printf用法

使用格式:printf  format, item1, item2….

要指定format

不會自動換行,換行需要使用\n

format用于為後面的每個item指定其輸出格式

(1)format的格式的訓示符以%開頭,後面跟一個字元

%c 顯示字元的ASCII碼
%d,%i 十進制整數
%e 科學計數法顯示數值
%f 顯示浮點數
%g 以科學計數法格式或浮點數格式顯示數值
%s 顯示字元串
%u 顯示無符号整數
%% 顯示%自身

将字元轉換為ASCII碼

格式處理器--AWK

列印為十進制

格式處理器--AWK

講某數轉換為科學計數格式

格式處理器--AWK

列印字元串

格式處理器--AWK
格式處理器--AWK

以浮點數的方式計數

格式處理器--AWK

其他就不一一示範了

=====================================================

(2)awk的輸出重定向

  >,  >>,  | 

特殊檔案描述符:

/dev/stdin:标準輸入
/dev/stdout:标準輸出
/dev/stderr:錯誤輸出
格式處理器--AWK

========================================================

(3)awk的操作符

算術操作符:+ ,-,*,**,%,正負值:+x,-x

字元串操作符:連接配接

指派操作符:=,+=,-=,*=,/=,%=,^=,**=,++,--

        如果模式自身是等号,要寫為/=/

比較操作符:<  <=  >   >=   ==   !*   ~   !~

邏輯操作符:&&   || 

(4)條件表達式

selector?if-ture-ezpression:if-false-expression

條件?為真輸出的内容:為假輸出的内容 

格式處理器--AWK

四、函數調用

function_name (argu1,argy2)

(1) Regexp:格式/PATTERN/        //僅處理被/PATTERN/比對到的行

格式處理器--AWK

(2)Expression:表達式,其結果為非0或非空字元串時滿足條件:

        僅處理滿足條件的行

格式處理器--AWK

(3)Ranges:行範圍,此前位址定界,startline,endline

        僅處理範圍内的行

(4)BEGIN/END:特殊模式,僅在awk指令的program運作之前或運作之後執行一次

(5)Empty:空模式,比對檔案中的所有行

五、控制語句

(1)   格式:if (condition) {then body}  [{else {else body}]

格式處理器--AWK

(2)  格式:while (condition) {while body}

#[root@bogon ~]# awk '{i=1;while (i>=NF) {if ($i>=20000) print $i;i++}}' test.txt

(3)  格式:do {do-while  body} while (condition)

格式處理器--AWK

(4)  格式:for (variable assignment ; condition; iteration process) {for body}

#awk -F: '{for(i=1;i<=3;i++) { if (length($i)>=8) {print $i}}}' /etc/passwd

  ***for循環可以用來周遊數組元素;文法:for  (i in  array) {for  body}

#awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%-15s:%i\n",A,BASH[A]}}' /etc/passwd

(5)switch  (expression) {case  VALUE  or  /RGEEXP/:  statement1;...default: statementN}

(6)  break     continue  循環控制

(7)next,提前結束本行的處理注解進入下一行的處理

格式處理器--AWK

六、 awk對于數組的應用  

   關聯數組 

       array[index-expression]

       index-expression:可以使用任意字元串;如果某數組元素在引用時事先不存在,那麼在引用時awk會自動建立此元素并初始化為空串,是以要判斷數組是否存在該元素,必須使用index in array  這中格式

        A[first]="hello awk"

        print A[second]

        要周遊數組中的每個元素,需要使用如下特殊結構

          for (var in array) (for body)

        其中var會周遊數組的索引

          state [LISTEN]++

格式處理器--AWK

         删除數組元素:需要從關系數組中删除數組的索引

        delete  array[index]

七、awk的内置函數

      1、 split(string,array[,fieldsep[,seps]]);

        功能:将string表示的字元串以fielfsep為分割符進行切片,并将結果儲存在數組中,數組以1開

       2、ength([string])

功能:傳回string字元串中字元的個數;

substr(string, start [, length])

功能:取string字元串中的子串,從start開始,取length個;start從1開始計數;

tolower(s)

繼續閱讀