gawk基礎

 一、gawk 是什么

在了解gawk之前,先了解一下文本三工具

    

文本過濾工具:grep|egrep|fgrep   其中fgrep不支持正則表達式

1.行編輯器:sed      sed 有兩種空間   模式空間    保持空間

2. 文本報告工具:awk|gawk    格式化文本輸出;他在處理文本文件時,對文檔中的數據有條件的輸出

3. gawk – pattern scanning and processing languageawk         本質上一個編程語言。   想要了解更詳細就 Google

現在先看看awk在系統上是?

圖片1.png

原來awk是gawk,從上面看就知道/bin/awk是gawk的軟連接

二、awk的工作方式

1.awk 一次讀取一行文本   用輸入分隔符(默認為空格)進行切片。

awk使用一行作為輸入(通過文件或者管道),并將這一行賦給內部變量$0,默認時每一行也可以稱為一個記錄,      以換行符結束\n

  $0

2.然后,行被空格分解成字段(單詞),每一個字段存儲在已經編號的變量中,$1開始。

$1

$2

$3

$4

………………

圖片2.png

圖片3.png



  以上實例就可以說明awk 的工作方式,awk默認是空格作為分隔符的。在awk中無論多少空格都會當一個空格。

 cat是無法理解多個空格的,準確的說是以固定的格式來識別的。 print后面會有說明。

三、awk的使用

1. 基本用法:gawk  [options] 'program'  FILE …..         

  program: PATTERN{ACTION STATEMENTS}    

  'program':   gawk自己的編程語言

  PATTERN:  模式

  ACTION STATEMENTS:動作語句:語句有多個可以用分號(;)分隔

  option:基礎常用的選項

  -F:指明輸入時用到的字段分隔符;

-v var=value: 自定義變量;

 輸出命令:在awk中總要輸出結果的。既然要輸出那就先了解一下簡單的輸出命令prin

2. print:

 print item1, item2, …

圖片4.png

從上述結果就可以看出print是逗號分隔。逗號是告訴print是多個字段的。

要點:

(1) 逗號分隔符;

(2) 輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式;

 例:

                                            

圖片5.png

   其中的hello就是字符串,6就是數值,

(3) 如省略item,相當于print $0; 

圖片6.png

 

  awk本質上是編程語言,那就他肯定也會有變量的。

 3. 變量:每一個-v選項定義一個變量;變量分內建變量和自定義變量

 常用的內建變量:  

FS:input field seperator,默認為空白字符;輸入字段分隔符

OFS:output field seperator,默認為空白字符;輸出字段分隔符

  例:

圖片7.png

圖片8.png

從上述例子可以看出,每一個-v定義一個變量,FS是輸入分隔符 ,OFS是輸出分隔符,

上述例子可以看出輸入的分隔符是:   輸出分隔符是—

RS:input record seperator,輸入時的換行符;行分隔符

ORS:output record seperator,輸出時的換行符;

 對于awk命令而言,處理字段分隔符,還有行分隔符。行分隔符可以自己定義

例:

 

   圖片9.png

圖片10.png

從上述例子就可以看出:就可以我把(:)定義為行分隔符了,輸入的是空格

 NF:number of field,字段數量   

  例:

圖片11.png

圖片12.png

這個就不說了 :就是一一對應的看就行了

{print NF}, {print $NF}   awk 中不需加$

如果加上$,就會引用最后段

NR:number of record, 行數;  顯示行數  對行統一技術

 FNR:各文件分別計數;行數;

 

例:

圖片13.png

從上述例子可以看出,NR是統計行數的,當多個文件時,他會統一的顯示所有的文件行數。

 FILENAME:當前正在處理的文件名;

圖片14.png

  ARGC:命令行給定的參數的個數;

 圖片15.png

 ARGV:數組,保存的是命令行所給定的各參數;awk也當做一個參數

 圖片16.png                

       自定義變量: 

        (1) -v var=value      var是變量名  value:值

 對于awk變量名也區分字 符大小寫;

圖片17.png

 

      (2) 在program中直接定義

圖片18.png

格式化輸出命令printf

                格式化輸出:printf FORMAT, item1, item2, …

                要點:

(1) FORMAT必須給出; 

(2) 不會自動換行,需要顯式給出換行控制符,\n  

(3) FORMAT中需要分別為后面的每個item指定一個格式化符號;

 

格式符:

%c: 顯示字符的ASCII碼;

%d, %i: 顯示十進制整數;

%e, %E: 科學計數法數值顯示;

%f:顯示為浮點數;

%g, %G:以科學計數法或浮點形式顯示數值;

%s:顯示字符串;

%u:無符號整數;

%%: 顯示%自身;

     例:

  圖片19.png

\n換行符,  

  圖片20.png

這個其實就是$1輸出的格式符就是%s,$2就是%i的修飾符。

                       格式符中還有修飾符:

#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度;

%3.1f

-: 左對齊

+:顯示數值的符號       

例:

圖片21.png

這個可以直接看上面。

4、awk中的操作符

(1)算術操作符:

x+y, x-y, x*y, x/y x^y, x%y  +:加  -:減:*乘:/除:^乘方:%:取余

-x:負數 

+x: 轉換為數值;

 

(2)字符串操作符:沒有符號的操作符,字符串連接

  賦值操作符:

  =

  +=

 -=

  *=

  /=

  %=

   ^=

  ++:自加

   –:自減

                          

(3)比較操作符:>, >=, <, <=, !=,  ==

 

(4)模式匹配符:

 ~:是否匹配

!~:是否不匹配

 

(5)邏輯操作符:

&& 與

|| 或

!  非

(6)函數調用:

function_name(argu1, argu2, …)

              

(7)簡單條件表達式:

selector?if-true-expression:if-false-expression

                         selector 條件表達時

圖片22.png

  awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

對  $3>=1000 判斷是否系統用戶還是普通用戶。 usertype="Common User":usertype="Sysadmin or SysUser"    定義類型  

printf "%15s:%-s\n",$1,usertype  輸出:如果大于1000輸出第一個也就是Common User,反之就第二個

5、PATTERN:模式

 

(1) empty:空模式,匹配文本的每一行;

                              之前用到的都是empty

(2) /regular expression/:僅處理能夠被此處的模式匹配到的行;

                              顯示./etc/fstab中的uuid的行

         awk  '/^UUID/{print $1}'  /etc/fstab      

                                   取反

                                 awk  '!/^UUID/{print $1}'  /etc/fstab

                        (3) relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;

真:結果為非0值,非空字符串;

                                判斷是系統用戶還普通用戶

                               awk ‘$3>=1000{print $1,$3},/etc/passwd

                               判斷shell是/bin/bash的用戶。

                               awk -F: '$NF=="/bin/bash"'{print $1,$NF}' /etc/passwd

                        (4) line ranges:行范圍,地址定界

startline,endline:/pat1/,/pat2/

                                  注意: 不支持直接給出數字的格式

                                        基于條件判斷的     

~]# awk -F: '(NR>=2&&NR<=10){print $1}'  /etc/passwd

(5) BEGIN/END模式

BEGIN{}: 僅在開始處理文件中的文本之前執行一次;

END{}:僅在文本處理完成之后執行一次;

   圖片23.png

圖片24.png

BEGIN{}只有執行一次的 END{}在結束時執行次

6、常用的action

 

(1) Expressions   :  表達式

(2) Control statements:if, while等; 控制語句

(3) Compound statements:組合語句;

(4) input statements輸入語句    

(5) output statements 輸出語句

      好了這就是基礎了 ,方正就是多練就行了  ,可以man  gawk 

 

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

(2)
N19_kingN19_king
上一篇 2016-06-24 12:48
下一篇 2016-06-26

相關推薦

  • 初學Linux之文本處理工具和正則表達

    1、各種文本工具來查看、分析、統計文本 ?
    2、grep ?
    3、正則表達式和擴展正則表達式 ?
    4、egrep

    2017-12-09
  • 馬哥教育網絡班21期+第8周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 集線器的主要功能是對接收到的信號進行再生整形放大,以擴大網絡的傳輸距離,同時把所有節點集中在以它為中心的節點上。它工作于OSI(開放系統互聯參考模型)參考模型第一層,即“物理層”。 網橋將兩個相似的網絡連接起來,并對網絡數據的流通進行管理。它工作于數據鏈路層,不但能擴展網絡的距離…

    Linux干貨 2016-09-19
  • 國際標準OSI七層模型和事實標準TCP/IP四層模型

    我們知道,標準分為三種:國際標準、國家標準和事實標準。那我們學習的兩個重要模型:OSI和TCP/IP模型分別屬于國際標準和事實標準,接下來我們來總結一下兩種模型的分層及功能還有異同: 一:國際標準OSI模型 OSI:(Open System Interconnect) 開放系統互連,總共分為七層,從下到上順序為:物理層(physical)、數據鏈路層(dat…

    2017-09-02
  • MySQL復制詳解

    目錄:        1、簡介        2、原理        3、常見復制架構        4、一主一叢異步復…

    Linux干貨 2015-10-01
  • 實現CA和證書申請,

    接下來講的是在centos7.3和centos6.8中實現CA和證書申請,centos7.3作為主機,centos6.8作為客戶端 首先你授權客戶端CA證書,必須本身主機也具有CA,自己證明自己,先CA自簽證書,然后在7.3創建私鑰 為了方便以后的操作CD進入 cd /etc/pki/CA   生成自簽名證書 -new:  生成…

    2017-04-11
  • Linux之bash shell腳本編程入門篇(一)

    什么是bash shell腳本編程? 答:Linux里面有多種shell,而CentOS和redhat的默認shell是bash shell。至于shell腳本,這個跟windows操作系統里面的批處理文件有點像(.bat的文件)。不知道大家還是否記得Linux的哲學思想嗎?其中有那么兩點點:由眾多目的的單一應用程序組成:一個程序只做一件事,且做好;組合目的…

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