格式處理器--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)各項之間用逗號分割,實現出來有空格;若用空格顯示出來則無空格

image

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

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

image

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

二、awk的變量

       主要分爲內置變量和自定義變量

(1)內置變量

FS:Filed Seperator 輸入時的字段分割fu
RS: 輸入行分割符
OFS 輸出時的字段分割符
ORS 輸出時的行分割符
NF 字段數
NR 行數,所有文件一併計數
FNR 行數,各文件分別計數
ARGV 數組保存命令本身的字符
ARGC 保存awk命令參數的個數
FILENAME awk正在處理的當前文件的名稱

下面舉例顯示一下區別:

(a)使用不同的分割

image

(b)對文件行數計數

image

(c)對各文件分別計數

image

(d)使用數組保存命令本事的字符

image

(e)保存命令參數的個數

image

(f)顯示awk當前正在處理的文件系統的名稱

image

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

(2)自定義變量

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

    a.可以在program中定義

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

image

三、awk的printf用法

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

要指定format

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

format用於爲後面的每個item指定其輸出格式

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

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

將字符轉換爲ASCII碼

image

打印爲十進制

image

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

image

打印字符串

image

image

以浮點數的方式計數

image

其他就不一一演示了

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

(2)awk的輸出重定向

  >,  >>,  | 

特殊文件描述符:

/dev/stdin:標準輸入

/dev/stdout:標準輸出

/dev/stderr:錯誤輸出

image

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

(3)awk的操作符

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

字符串操作符:連接

賦值操作符:=,+=,-=,*=,/=,%=,^=,**=,++,--

        如果模式自身是等號,要寫爲/=/

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

邏輯操作符:&&   || 

 

(4)條件表達式

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

條件?爲真輸出的內容:爲假輸出的內容 

image

 

四、函數調用

function_name (argu1,argy2)

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

image

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

        僅處理滿足條件的行

image

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

        僅處理範圍內的行

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

(5)Empty:空模式,匹配文件中的所有行

 

五、控制語句

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

image

(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)

image

(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,提前結束本行的處理註解進入下一行的處理

image

六、 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]++

          state [LISTEN]++

      image

         刪除數組元素:需要從關係數組中刪除數組的索引

        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)

3、能:將s中的所有字母轉爲小寫

toupper(s)

功能:將s中的所有字母轉爲大寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章