實踐中學習 awk

一. 命令awk簡介html

    1. awk是一種編程語言,用於對文本和數據進行處理的shell

    2. 具備強大的文本格式化能力express

    3. 利用命令awk,能夠將一些文本整理成爲咱們想要的樣子編程

    4. 命令awk是逐行進行處理的數組

二. grep、sed、awk的簡單比較bash

    1. 命令grep,更適合單純的查找或匹配文本app

    2. 命令sed,更適合對匹配到的文本進行編輯編程語言

    3. 命令awk,更適合文本格式化,對文本進行較複雜的格式處理函數

3、內置變量

   一、awk 中預先定義好的,內置在 awk 內部的變量。
ui

變量名	描述
FS	輸入字段分隔符,默認是空格
OFS	輸出字段分隔符,默認是空格
RS	輸入記錄分隔符,默認換行符
ORS	輸出記錄分隔符,默認換行符
NF	number of fields,當前記錄中域的個數,也就是每行有多少列
NR	number of rows,已經讀出的記錄數,也就是行號。從1開始,有多個文件時,這個值會累加
FNR	各個文件分別計數的行號
FILENAME	當前文件名
AGRC	命令行參數的個數
ARGV	數組,保存命令行所傳的各個參數複製代碼

4、記錄

複製代碼

  1. awk 把每個換行符結束的行稱爲一個記錄,$0 變量:它指的是整條記錄。

    # 輸出 test.txt 文件中的全部記錄 
    awk '{print $0}' test.txt 複製代碼
  2. 變量 NR:一個計數器,每處理完一條記錄,NR 的值就增長 1。

    # 輸出 test.txt 中的全部記錄,並在記錄前顯示行號
    awk '{print NR, $0}' test.txt複製代碼

5、域

  1.  記錄中的每一個單詞都稱做「域」,默認狀況下以空格分隔。awk 可跟蹤域的個數,並在內建變量 NF 中保存該值。

    # 打印第一和第三個以空格分開的列(域)
    awk '{print $1, $3}' test.txt複製代碼

6、awk語法格式

  1. 有了上邊域和記錄的概念,來看看 awk 的命令格式:

    awk [options] 'pattern{action}' file複製代碼

    1. test1

      # $3 == 0:是 pattern
      # print $0:是 action 
      awk '$3==0 {print $0}' employee  # 若是第三個域等於 0,則將這行打印      複製代碼
    2.   test2,下面這個 awk 腳本沒有指定 action,但結果和 eg1 同樣,沒有指定 action 時默認是 {print $0}(打印整行)。

      awk '$3 == 0' employee            複製代碼
    3. test3

      #將結果重定向到文件
      awk '$3 == 0' employee > other.txt複製代碼

7、域分隔符

  1. 輸入分隔符(field separator),就是 test.txt 中每一個列是以什麼進行分隔的,awk 默認以空格對每一行進行分隔,分隔符得值保存在內建變量 FS中,能夠經過-F命令行選項修改FS的值。

    # 指定 : 做爲分隔符
    awk -F: '{print $1, $3}' test.txt
    # 顯示指定空格做爲分隔符 
    awk -F'[ ]' '{print $1, $3}' test.txt
    # 指定空格、冒號、tab 做爲分隔符
    awk -F'[:\t ]' '{print $1, $3}' test.txt
    
    # 指定以逗號(,)做爲分隔符
    awk -F, '{print $1, $2}' separator.txt
    # 使用 -v 選項對內建變量設置分隔符,和 awk -F, 效果同樣 
    awk -v FS=',' '{print $1, $2}' separator.txt複製代碼
  2. 輸出分隔符(out field separator), 大白話表示就是 awk 在處理完文本後以什麼字符做爲分隔符將每行輸出,默認也是空格,保存在內建變量 OFS 中。
    1. test1:

      # 對內建變量 OFS 賦值
      awk -v OFS="->" '{print $1, $2, $3}' other.txt複製代碼

            輸出如: Beth->4.00->0 Dan->3.75->0      

    1. test2:

      # 同時指定輸入和輸出分隔符 
      awk -v FS=',' -v OFS='->' '{print $1, $2}' separator.txt複製代碼

8、模式-Pattern

      1.根據前面的一些例子,awk 的語法以下

awk [options] 'Pattern {Action}' file1 file2 
options(選項): 如前面使用過的 -v -F
Action(動做):如 print 複製代碼

      2.Pattern:也就是條件,一個關係表達式,awk 會逐行處理文本,處理完當前行,而後再          處理下一行。若是不指定任何的「條件」,awk 會一行一行的處理完文件的每一行,若是          指定了「條件」,只處理知足條件的行。這即 awk 中的模式。

# 將有四列的行打印出來 
awk 'NF == 4 {print $0}' column.txt
# 沒有指定模式則是空模式,空模式會匹配文本中每一行,每一行都知足條件 
awk '{print $0}' test.txt複製代碼

    • 正則模式
  1. # 將包含 in 的記錄行進行打印 
    awk '/in/ {print $0}' pattern.txt複製代碼
    1. 行範圍模式
      1. eg1:

        # 從第一行 到 正則匹配到的第一行 之間的全部行進行打印
        awk 'NR == 1, /in/{print $0}' pattern.txt
        # /xx/ 沒有匹配到第二個模式,打印第一個模式出現的行到文本末尾
        awk 'NR == 1, /xx/{print NR, $0}' pattern.txt複製代碼

        結果   
      2. eg2:

        # 將第一行 到 正則匹配到的第一行中的 in 替換爲 on(從記錄行的左邊開始,只替換一次)
        # 怎麼理解這個 1 呢?
        # 這裏有兩個模式,awk 讀出每行記錄都會通過這兩個模式的判斷
        # 1 表示這個模式爲真,沒有指定模式默認的 action 就是打印整行 
        awk 'NR == 1,/in/{sub(/in/, "on")} 1' pattern.txt複製代碼

        結果
        再來一波例子估計就懂 eg2 中的用法了:
        在 1 處,模式指定爲 1 表示爲真,走默認的 action 打印整行。 在 2 處,指定了兩個模式,每行記錄都會通過這兩個模式的處理,而後分別執行模式本身的動做。 在 3 處,有 3 個模式:BEGIN 模式和 END 模式,中間的是空模式(沒有指定模式)。BEGIN 模式:處理文本以前先執行的操做;END 模式:處理完全部行後須要執行的操做。 範圍模式的第一個模式和第二個模式都以第一次匹配到的行爲準。     

9、awk 內建函數

  1. 字符串函數
    1. sub

      sub (regular expression, substitution string):
      sub (regular expression, substitution string, target string)複製代碼
    2.    對每個記錄行從左到右第一個匹配到的域進行替換,每一行只會匹配替換一次。

      # 將每行第一次出現的域 hello 替換爲 hi,每行只會匹配替換一次 
      awk '{sub(/hello/, "hi"); print}' test.txt
      # 對每行的第一個域進行替換 
      awk '{sub(/hello/, "hi", $1); print}' test.txt複製代碼

參考:

AWK程序設計語言
awk 從放棄到入門

AWK 簡明教程
www.jianshu.com/p/8c6a0d0d4…

blog.csdn.net/jiaobuchong…

相關文章
相關標籤/搜索