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 09:04

相關推薦

  • free命令的介紹及參數的詳細分析

           通過對free命令的深入學習,我覺得有必要整理一個文檔,供自己和小伙伴們今后的復習使用。   free 命令的詳細剖析      參數有:-b/k/m/g    分別以bytes/kilobytes/megabyte…

    2017-07-17
  • 磁盤管理

    CHS cylinder-head-sector cylinder柱面=track*head=512*63*256=8M  磁盤分區 為什么是分區? ? 優化I/O 性能 ? 實現磁盤空間配額限制 ? 提高修復速度 ? 隔離系統和程序 ? 安裝多個OS ? 采用不同文件系統   MBR:使用32位表示扇區數量,按每扇區512字節計算,每個…

    Linux干貨 2016-08-29
  • linux終端的類型與linux發展歷史

    一、linux console的類型與說明 說明:        1 由于虛擬終端的實現,人們可以多用戶多任務的在一臺計算機操作系統上工作             2 在80或90年代的舊電腦上,人們只能用分屏這樣的方法來實現多用戶,多任務的工作  …

    Linux干貨 2016-11-03
  • 15 權限管理及作業

    15 權限管理及作業(作業單獨一篇) 一、雜項知識整理 1、訪問控制列表:ACL:Access Control List,實現靈活的權限管理。     除了文件的所有者,所屬組和其它人,可以對更多的用戶設置權限。     centos7.0之后默認創建的ext4文件系統有ACL功…

    Linux干貨 2016-08-04
  • 中秋干貨之系統啟動修復

    在使用CentOS系統時,難免會有誤操作而導致機器不能正常啟動,這里介紹了多種啟動失敗的原因和修復的方法。 grub損壞類 grub 1stage 被破壞使用dd擦寫MBR前446字節,即抹去stage1階段–[root@_2_ ~]# reboot #重啟–啟動失敗,找不到系統,這時只能借助光盤進入修復模式,重新安裝grub&#82…

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