awk 系列:如何使用 awk 內置變數
awk 內置變數示例
awk 內置變數已經有預先定義的值了,但我們也可以謹慎地修改這些值,awk 內置變數包括:
FILENAME
: 當前輸入文件名稱NR
: 當前輸入行編號(是指輸入行 1,2,3……等)NF
: 當前輸入行的欄位編號OFS
: 輸出欄位分隔符FS
: 輸入欄位分隔符ORS
: 輸出記錄分隔符RS
: 輸入記錄分隔符
讓我們繼續演示一些使用上述 awk 內置變數的方法:
想要讀取當前輸入文件的名稱,你可以使用 FILENAME
內置變數,如下:
$ awk ' { print FILENAME } ' ~/domains.txt
awk FILENAME 變數
你會看到,每一行都會對應輸出一次文件名,那是你使用 FILENAME
內置變數時 awk 默認的行為。
我們可以使用 NR
來統計一個輸入文件的行數(記錄),謹記,它也會計算空行,正如我們將要在下面的例子中看到的那樣。
當我們使用 cat 命令查看文件 domains.txt 時,會發現它有 14 行文本和 2 個空行:
$ cat ~/domains.txt
輸出文件內容
$ awk ' END { print "Number of records in file is: ", NR } ' ~/domains.txt
awk 統計行數
想要統計一條記錄或一行中的欄位數,我們可以像下面那樣使用 NR 內置變數:
$ cat ~/names.txt
列出文件內容
$ awk '{ "Record:",NR,"has",NF,"fields" ; }' ~/names.txt
awk 統計文件中的欄位數
接下來,你也可以使用 FS 內置變數指定一個輸入文件分隔符,它會定義 awk 如何將輸入行劃分成欄位。
FS 默認值為「空格」和「製表符」,但我們也能將 FS 值修改為任何字元來讓 awk 根據情況切分輸入行。
有兩種方法可以達到目的:
- 第一種方法是使用 FS 內置變數
- 第二種方法是使用 awk 的 -F 選項
來看 Linux 系統上的 /etc/passwd
文件,該文件中的各欄位是使用 :
分隔的,因此,當我們想要過濾出某些欄位時,可以將 :
指定為新的輸入欄位分隔符,示例如下:
我們可以使用 -F
選項,如下:
$ awk -F':' '{ print $1, $4 ;}' /etc/passwd
awk 過濾密碼文件中的各欄位
此外,我們也可以利用 FS 內置變數,如下:
$ awk ' BEGIN { FS=「:」 ; } { print $1, $4 ; } ' /etc/passwd
使用 awk 過濾文件中的各欄位
使用 OFS 內置變數來指定一個用於輸出的欄位分隔符,它會定義如何使用指定的字元分隔輸出欄位,示例如下:
$ awk -F':' ' BEGIN { OFS="==>" ;} { print $1, $4 ;}' /etc/passwd
向文件中的欄位添加分隔符
在本節中,我們已經學習了使用含有預定義值的 awk 內置變數的理念。但我們也能夠修改這些值,雖然並不推薦這樣做,除非你明白自己在做什麼,並且充分理解(這些變數值)。
此後,我們將繼續學習如何在 awk 命令操作中使用 shell 變數,所以,請繼續關注我們。
via: http://www.tecmint.com/awk-built-in-variables-examples/
作者:Aaron Kili 譯者:ChrisLeeGit 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive