shell 之 AWK(八)

        今天我們來看看 AWK,那麼 AWK 是什麼呢?AWK 是一個優良的文本處理工具,Linux 及 Unix 環境中現有的功能最強大的數據處理引擎之一。它的分類有 NAWK GAWK AWK。AWK 經過改進生成的新的版本 GAWK,NAWK,現在默認linux系統下日常使用的是 GAWK。

        下來我們來看看 AWK 的執行流程,如下圖所示

圖片.png

        我們看到它也是行處理模式,每讀取一行便讀取到剝離體中。下來我們來看看 awk 命令的格式:awk -Fs 'BEGIN{ } /pattern/ {action} END{ }' input-file ;-F 是指定分隔符。

圖片.png

        我們看到以 , 結尾的,打印出三個段。

        下面我們來看看 awk 中的內置變量:

        a> awk 分隔符 FS:

            awk 'BEGIN { FS=","; \
            print "-------------\nName\tTitle\n-------------" } \
            { print $2,"\t",$3; } \
            END {print "-------------"}' employee.txt

圖片.png

        我們以 \t 的格式打印出 Name 和 Title。

        b> 指定多個分隔符,格式:awk 'BEGIN {FS="[,:%]"} {action}' input-file

圖片.png

        我們看到我們以第 2 段和第 3 段的格式輸出信息。

        c> 輸出分隔符 OFS,格式:awk -F ',' '{print $2, ":", $3}' employee.txt 等同於 awk -F ',' 'BEGIN { OFS=":" } { print $2, $3 }' employee.txt 

圖片.png

        d> 指定分隔符並換行 RS,指定分割字符,將一行分成多行。

        輸入示例如下

圖片.png

圖片.png

        e> 輸出分隔符 ORS

圖片.png

        下來我們來看看AWK 中的 print 和 printf,那麼它們有何區別呢?在 print 中不需要加引號,字符串需要加引號。示例:date | awk '{print Month: " $2 "\nYear:",$1} ' ;printf 與 C 語言基本一致,轉移字符:- %c 字符、- %s 字符串、- %d 十進制整數、- %f 浮點型

圖片.png

        我們看到 print 和 printf 的區別,僅僅只是需要加引號的區別,printf 和 C 語言中的打印方式是一樣的。我們來看看一個 awk 中的內置變量 OFMT,它的作用是幹什麼嘞?它是控制輸出的,示例:date | awk '{OFMT="%.2f"; print 1.3456, 3.45}'

圖片.png

        我們接下來看看幾個實例應用:

        1、將以下字符串以:分隔,分成多行

        101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane Miller

圖片.png

        2、windows 與 Linux 文件格式轉換

        命令:awk 'BEGIN{RS="\n";ORS="\r\n"} {print $0}' README.txt > README.WIN

圖片.png

        我們看到在 Windows 下打開 README.txt 格式是不對的,都在一行。但是經過 awk 命令的轉換後,它就符合了 Windows 下的文本格式,將 Linux 下的換行符 \r\n 轉換成 Windows 下的 \n 換行符的格式。下來我們再來看看 awk 中的內置變量,掌握更多的內置變量將有利於我們更高效的進行開發。還是將以下內容放入我們的 employee.tx 文本中

101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

        我們來看看一個內置變量 NR,它的作用是記錄處理的行號。示例:awk '/Jason/ { print NR, $0}' employee.txt

圖片.png

        那麼我們多複製幾個文本呢,看看結果是怎樣的

圖片.png

         我們看到記錄到的行號是  2 7 12,那麼這是爲什麼呢?NR 變量不會重置計數器,這便是我們要強調的一個注意事項。

         FILENAME 內置變量,它的作用是同時處理多個文件時,用來標誌當前處理的文件名 。注意:1) 處理文本時顯示文件;2) 從管道輸入流接收內容時顯示  "-"

圖片.png

        我們看到在輸出時加字符串必要要用雙引號括起來,同時我們也可用 NR 來進行行號的輸出。在管道後接收內容時會顯示 "-"。

        接下來我們來看看 FNR 內置變量,它跟NR 內置變量類似,但會重置計數器。
圖片.png

        我們看到三個打印的都是第 2 行。

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