awk基本用法

一、awk介紹

    awk、sed&grep都可以匹配文本,但sed和awk可以對文本進行編輯,grep則不具有此功能;sed是非交互式的流編輯器,而awk則是一門模式匹配的編程語言。awk主要用于處理匹配的文本,同時awk還支持編程語言的一些特性,如變量、函數、循環語句等。   

二、基本用法

       1)awk [options] 'program' File1,File2…

       program:Pattern{Action Statements}

       program通常位于單引號中,多個action語句之間用逗號分隔。

2)awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file …

       常用action:print printf

       常用options:

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

       -v var=value:聲明變量

三、awk的工作原理

       1)在處理文本之前,若存在BEGIN語句塊,則先執行此語句塊中的語句。

       2)將輸入的文本或標準輸入按回車(\n)分割,解析為多個記錄(record,默認以\n分隔,記錄的分割符可以同過awk的內置變量RS來更改)。

       3)記錄會被切割成多個字段(filed,默認情況下,以空白字符切割不同的字段,包括空格和制表符,字段的分隔符可以通過-F選項及awk內置變量FS來指定),并將第一個字段存放在$1中,第二個字段存放在$2中,倒數第二個字段存放在$(NF-1),最后一個字段存放在$NF中。$0則表示匹配到的整條記錄。

       4)如果讀取到的記錄與pattern想匹配,則執行器指定的action;若不匹配,則跳過action,直到完成所有的語句。

       5)當以條輸入記錄處理完成之后,繼續讀取下一條記錄,重復上面的動作,直到處理完全部的輸入。若果輸入的是文件列表,awk將按順序處理列表中的文件。

       6)awk處理完所有的輸入之后,若存在END語句塊,則執行END語句塊中的語句。

       BEGIN、END語句都是可選的。

四、awk調用方式

主要有三種調用方式,分別為:

       1) awk命令行

       可以在命令行中使用awk 程序設計語言,也可以在shell script 程序中引用awk 命令行甚至awk 程序腳本。

       2) 使用-f 選項調用awk 程序

       awk 允許將一段awk 程序寫入一個文本文件,然后在awk 命令行中用-f 選項調用并執行這段程序。

       3) 利用命令解釋器調用awk 程序

       利用命令解釋器功能,我們可以將一段awk 程序寫入文本文件,然后在它的第一行加上#!/bin/awk –f.

五、awk使用詳解

1、print:用于輸出指定的內容

print item,item2,…

要點:

1)逗號分隔多個item

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

       3)如省略item,相當于print $0,即輸出被pattern匹配的記錄。

例:在系統上每個用戶名之前加上hello

blob.png

例:

blob.png

2、printf命令

用于格式化輸出:printf Format,item1,item2,….

1)Format 必須給出

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

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

格式符:

       %c:不現實字符本身,而是顯示字符的ASCII碼

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

       %e,%E:以科學記數法數值顯示

       %f:顯示為浮點數

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

       %u:無符號整數

       %s:顯示為字符串

       %%:顯示%自身

例:顯示用戶名及其ID

blob.png

blob.png

  修飾符:對格式符進行修飾

              #[.#]:第一個數字控制顯示的寬度(度量值:字符數),第二個表示小數點后的精度

              %3.1f

              :左對齊

              +:右對齊。默認為右對齊

例:在上例中,由于用戶名的長度長短不一,在輸出時不夠清晰。使用修飾符能讓輸出更具易讀性。

左對齊:

]#awk -F: '{printf "username is: %-15s;userid is %i\n",$1,$3}' /etc/passwd

blob.png

右對齊:

]#awk -F: '{printf "Your name is %+15s,your id is %i\n",$1,$3}' /etc/passwd

blob.png

3、變量

3.1 內建變量

       FS:input field separator,指定輸入時的字段分隔符;默認為空白字符

       OFS:output field separator:指定輸出時的字段分隔符;默認為空白字符

       RS:input record separator:指定輸入時的換行符;默認為空白

       ORS:output record separator:指定輸出時的換行符,默認為空白

       NF:number of field,每行的字段數量

              {print NF}

              $NF 標識最后一個字段

       NR:number of record,文件的行的數量

       FNR:若awk處理多個文件,則每個文件分別統計行數。若不指定,所有文件累計行數。

       FILENAME:當前文件名

       ARGC:命令行參數的

       ARGV:數組,保存的是命令行所給定的各參數

例:用FS指定字段分隔符,注意,在awk中,每個變量之前需要用-v來指定。

blob.png

例:指定輸出的字段分隔符。

blob.png

blob.png

3.2 自定義變量

       (1)-v var=value

              注意:變量名區分大小寫

       (2)在program中直接定義

blob.png

blob.png

4、操作符

       算術操作符:+ ,- ,* ,/ ,%, ^

              -n::轉換為負數

              +n:將字符串轉換為數值

       字符串操作符:沒有符號的操作符,表示連接字符串

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

       比較操作符:< ,> ,<= ,>= ,==, !=

       模式操作符:

              ~:左側的字符串是否被右側的模式所匹配

              !~:左側的字符串是否被右側的模式不匹配

       邏輯操作符: && || !

       函數調用:function_name(argu1,argu2…)

       條件表達式:selector?if-true-expression:if-false-expression

例:使用條件表達式判斷用戶是普通用戶還是系統用戶或管理員

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

blob.png

5、PATTERN

5.1)empty:空模式,匹配每一行

5.2)/Regular Expression/:僅處理被模式匹配的每一行

例:輸出/etc/fstab文件中不是以UUID開頭的行的第一個字段。

      輸出/etc/fstab文件中以UUID開頭的行的第一個字段。

blob.png

5.3)relational expression:關系表達式;結果有“真”有“假”;結果為真的才被處理。

真:結果為非0值表示為真,非空字符串也表示為真

假:0表示為假,空字符串也表示為假

例:

         1)輸出uid大于1000的用戶的用戶名

       2)輸出小于等于1000的用戶的用戶名

       3)輸出shell為/bin/bash的用戶的用戶名及其shell

blob.png

blob.png

5.4)line ranges:指定行范圍

       startline,endline:/part1/,/part2/

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

例:查找/etc/passwd文件中root到shutdown用戶之間個用戶的用戶名及uid。

]#awk -F: '/^root\>/,/^shutdown\>/{print $1,$3}' /etc/passwd

blob.png

例:輸出/etc/passwd中從第2行(不包括第2行)到第10行(包括第10行)的用戶名及其UID

blob.png

5.5)BEGIN/END模式

       BEGIN{}BEGIN 語句塊在awk 開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通??梢詫懺贐EGIN語句塊。  END{}END 語句塊在awk 從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END 語句塊中完成,它也是一個可選語句。

例:

]#awk -F: 'BEGIN{print "   usernameuid\n--------------------"}{print $1,$3}END{print "-----------------\n        end        " }' /etc/passwd

blob.png

blob.png

原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/48228

(0)
M20-1鐘明波M20-1鐘明波
上一篇 2016-09-21 13:28
下一篇 2016-09-21 14:05

相關推薦

  • Apache配置壓縮優化時報錯——undefined symbol: inflateEnd

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1345264    圣誕都過了,好久沒來51發博文了。最近一直在忙考試和其他一些私人事務,感覺長期不發博文,有點不好。不是不發,實在是最近…

    Linux干貨 2016-08-15
  • linux 基礎命令(四)

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其他用戶均沒有任何訪問權限。 [root@localhost home]# cp -r /etc/skel/ /home/tuser1 [root@localhost home]# c…

    Linux干貨 2016-10-16
  • 第二周作業

    linux 文件管理命令 rm、mv、cp rm rm命令:remove rm [OPTION]… FILE… 常用選項: -i:interactive (默認rm是‘rm -i’的別名) -f:force -r: recursive        &nb…

    Linux干貨 2016-12-08
  • jenkins+gitlab構建安卓自動編譯環境

        因工作關系接觸到接觸到安卓自動編譯環境,網上的資料都推薦了jenkins,因為第一次接觸安卓和jenkins,踩了不少的坑,有總結才有進步。    gitlab環境之前已經安裝完成可用,具體步驟另外詳解吧。本例目標是在gitlab可用前提下,通過jenkins將git倉庫的代碼自行編譯打包,生成可用的apk安裝…

    Linux干貨 2016-07-16
  • 高考作業

    1、簡述TCP三次握手四次揮手過程及各過程中客戶端和服務器端的狀態。 TCP三路握手,作用為完成三次握手,主機A與主機B開始傳送數據。 第一次握手:客戶端A(狀態為SYN_SEND)發送位碼為syn=1,隨機產生seq number=1234567的數據包到服務器,服務器B(狀態為LISTEN)由SYN=1知道,客戶端A要求建立聯機; 第二次握手:服務器B(…

    Linux干貨 2016-06-22
  • MBR、GPT的結構和區別

    本章學習內容         ——–介紹MBR、GPT         ——–不同的啟動流程         ——–分區結構 &nb…

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