歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux高級文本處理之gawk內置變量

Linux高級文本處理之gawk內置變量

日期:2017/2/28 13:43:46   编辑:Linux教程

一、FS –輸入字段分隔符

FS是awk內置變量,用來制定行分隔符,功能能-F一樣,區別在於FS只能用在BEGIN語句塊當中,命令格式如下:

BEGIN{FS="SEPARATOR"}

實例1:

[root@localhost ~]# awk 'BEGIN { FS=",";\
 print "---------------------------\nName\tTitle\n------------------------"}\
 {print $2,"\t",$3;}\ 
 END {print "-----------------------------------------"}' emp 
---------------------------
Name    Title
------------------------
John Doe         CEO
Jason Smith      IT Manager
Raj Reddy        Sysadmin
Anand Ram        Developer
Jane Miller      Sales Manager
-----------------------------------------

注意:默認的字段分隔符不僅僅是單個空格字符,它實際上是一個或多個空白字符。

當遇到一個包含多個字段分隔符的文件時,你可以使用正則表達式來指定多個字段分隔符,如 FS = "[,:%]" 指定字段分隔符可以是逗號 ,或者分號 : 或者百分號 % 。

實例2:

[root@localhost ~]# cat emp1
101,John Doe:CEO%10000
102,Jason Smith:IT Manager%5000
103,Raj Reddy:Sysadmin%4500
104,Anand Ram:Developer%4500
105,Jane Miller:Sales Manager%3000

[root@localhost ~]# awk 'BEGIN{FS="[,:%]"}{print $2,"\t",$3}' emp1 #使用正則表達式匹配
John Doe         CEO
Jason Smith      IT Manager
Raj Reddy        Sysadmin
Anand Ram        Developer
Jane Miller      Sales Manager

二、OFS – 輸出字段分隔符

FS 是輸入字段分隔符,OFS 是輸出字段分隔符。OFS 會被打印在輸出行的連續的字段之間。 默認情況下,awk 在輸出字段中間以空格分開。

實例1:

[root@localhost ~]# awk 'BEGIN{FS=",";OFS=":"}{print $2,$3}' emp     
John Doe:CEO
Jason Smith:IT Manager
Raj Reddy:Sysadmin
Anand Ram:Developer
Jane Miller:Sales Manager

注意與下面情況區分,如下情況會多輸出空格字符:

[root@localhost ~]# awk -F, '{print $2,":",$3}' emp
John Doe : CEO
Jason Smith : IT Manager
Raj Reddy : Sysadmin
Anand Ram : Developer
Jane Miller : Sales Manager

實例3:使用逗號與不使用逗號的區別

[root@localhost ~]# awk 'BEGIN{print "text1","text2"}' #使用逗號默認使用OFS
text1 text2

[root@localhost ~]# awk 'BEGIN{print "text1""text2"}'  #不使用逗號默認不使用OFS
text1text2

三、RS – 記錄分隔符

Awk 默認的記錄分隔符是換行符。

實例1:將文件emp2內容作為 5 行記錄來處理(而不是單獨的一行), 並且打印每條記錄中雇員的姓名

[root@localhost ~]# cat emp2
101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller

[root@localhost ~]# awk -F, 'BEGIN{RS=":"}{print $2}' emp2 #將冒號結尾當做一行處理
John Doe
Jason Smith
Raj Reddy
Anand Ram
Jane

實例2:打印emp3文件中雇員名稱和職位

[root@localhost ~]# cat emp3
101
John Doe
CEO
-
102
Jason Smith
IT Manager
-
103
Raj Reddy
Sysadmin
-
104
Anand Ram
Developer
-
105
Jane Miller
Sales Manager

[root@localhost ~]# awk 'BEGIN{RS="-\n";FS="\n"}{print $2,$3}' emp3 
John Doe CEO
Jason Smith IT Manager
Raj Reddy Sysadmin
Anand Ram Developer
Jane Miller Sales Manager

四、ORS – 輸出記錄分隔符

ORS 是輸出字段分隔符,默認輸出字段分隔符為換行。

實例1:在每個輸出行後面追加"---------"

[root@localhost ~]# cat emp
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager   

[root@localhost ~]# awk 'BEGIN{FS=",";ORS="\n---------\n"}{print $2,$3}' emp
John Doe CEO
---------
Jason Smith IT Manager
---------
Raj Reddy Sysadmin
---------
Anand Ram Developer
---------
Jane Miller Sales Manager
---------

實例2:把每個字段打印成單獨一行,每條記錄用”---“分隔

[root@localhost ~]# awk 'BEGIN{FS=",";OFS="\n";ORS="\n---\n"}{print $1,$2,$3}' emp
101
John Doe
CEO
---
102
Jason Smith
IT Manager
---
103
Raj Reddy
Sysadmin
---
104
Anand Ram
Developer
---
105
Jane Miller
Sales Manager
---

五、NR – 記錄序號

NR 非常有用,在循環內部標識記錄序號。用於 END 區域時,代表輸入文件的總記錄數。確切的叫法是"記錄的序號"(Number of the Record)”,也就是當前記錄在所有記錄中的行號。

注意:NR 會在多個文件中持續增加,當處理到第二個文件時, NR 不會被重置為 1,而是在前一個文件的 NR 基礎上繼續增加。

實例1:多文件打印行號

1 [root@localhost ~]# awk '{print NR,$1}' emp emp1 1 101,John 2 102,Jason 3 103,Raj 4 104,Anand 5 105,Jane 6 101,John 7 102,Jason 8 103,Raj 9 104,Anand 10 105,Jane

實例2:

[root@localhost ~]# awk 'BEGIN{FS=","}
> {print "Emp id of record number",NR,"is",$1;}
> END{print "Total number of records:",NR}' emp
Emp id of record number 1 is 101
Emp id of record number 2 is 102
Emp id of record number 3 is 103
Emp id of record number 4 is 104
Emp id of record number 5 is 105
Total number of records: 5

實例3:BEGIN中的NR值為0

[root@localhost ~]# awk 'BEGIN{print NR}{print $1}' emp emp1   
0
101,John
102,Jason
103,Raj
104,Anand
105,Jane
101,John
102,Jason
103,Raj
104,Anand
105,Jane

六、FILENAME – 當前處理的文件名

當使用 awk 處理多個輸入文件時, FILENAME 就顯得很有用,它代表 awk 當前正在處理的文 件。

實例1:

[root@localhost ~]# cat emp
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
[root@localhost ~]# cat emp2
101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller
[root@localhost ~]# awk '{print FILENAME,$1}' emp emp2
emp 101,John
emp 102,Jason
emp 103,Raj
emp 104,Anand
emp 105,Jane
emp2 101,John

如果 awk 從標准輸入獲取內容, FILENAME 的值將會是"-"。

實例二:從標准輸入獲取內容

[root@localhost ~]# awk '{print "Last name",$2;print "Filename:",FILENAME}'
John Deo 
Last name Deo
Filename: -

管道一樣:

[root@localhost ~]# echo "John Doe"|awk '{print "Last name:",$2;print "Filename:",FILENAME}'Last name: Doe
Filename: -

注意:在 BEGIN 區域內, FILENAME 的值是空,因為 BEGIN 區域只針對 awk 本身,而不處理任何文件。

[root@localhost ~]# echo "John Doe"|awk '
>BEGIN{print FILENAME}
>{print "Last name:",$2;print "Filename:",FILENAME}
>END{print FILENAME}' 

Last name: Doe
Filename: -
-

七、FNR – 文件中的 NR

awk處理多文件時FNR與NR不同的地方在於,NR連續計數,處理完第一個文件後第二個文件的NR數不會置零,FNR會置零重新計算。

實例1:同時打印 NR 和 FNR

[root@localhost ~]# awk '{print FILENAME,"NR is",NR";""FNR is",FNR}' emp emp2
emp NR is 1;FNR is 1     #emp文件5行,emp2文件1行
emp NR is 2;FNR is 2
emp NR is 3;FNR is 3
emp NR is 4;FNR is 4
emp NR is 5;FNR is 5
emp2 NR is 6;FNR is 1

八、NF - 字段數量

實例1:

[root@localhost ~]# head -1 /etc/passwd
root:x:0:0:young,geek,010110110,0101101101:/root:/bin/bash

[root@localhost ~]# head -1 /etc/passwd|awk -F: '{print NF}'
7

九、ARGC - 命令行參數的個數

ARGC表示命令行中awk命令後面跟的參數的個數,包含awk命令自身。

實例1:

[root@localhost ~]# awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab  
3
[root@localhost ~]# awk 'BEGIN {print ARGC}' /etc/fstab
2
[root@localhost ~]# awk 'BEGIN {print ARGC}'

十、ARGV - 命令行保存參數內容

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

實例1:

[root@localhost ~]# awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/passwd  #awk命令自身也包括
awk
[root@localhost ~]# awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/passwd 
/etc/fstab
[root@localhost ~]# awk 'BEGIN {print ARGV[2]}' /etc/fstab /etc/passwd 
/etc/passwd

十一、$NF - 最後字段內容

$NF表示每行的最後一個字段的內容

實例1:

[root@localhost ~]# head -1 /etc/passwd
root:x:0:0:young,geek,010110110,0101101101:/root:/bin/bash

root@localhost ~]# head -1 /etc/passwd|awk -F: '{print $NF}'
/bin/bash
[root@localhost ~]# head -1 /etc/passwd|awk -F: '{print $(NF-1)}'
/root
[root@localhost ~]# head -1 /etc/passwd|awk -F: '{print $(NF-2)}'
young,geek,010110110,0101101101

十二、IGNORECASE - 忽略大小寫

默認情況下, IGNORECASE 的值是 0,所有 awk 區分大小寫。當把 IGNORECASE 的值設置為 1 時, awk 則不區分大小寫,這在使用正則表達式和比較字符串時很有效率。

實例1:

[root@localhost ~]# cat items.txt 101,HD Camcorder,Video,210,10 102,Refrigerator,Appliance,850,2 103,MP3 Player,Audio,270,15 104,Tennis Racket,Sports,190,20 105,Laser Printer,Office,475,5 [root@localhost ~]# cat ign.awk BEGIN { FS=","; IGNORECASE=1; } { if ($3 == "video") print $0; if ($2 ~ "TENNIS") print $0; } [root@localhost ~]# awk -f ign.awk items.txt 101,HD Camcorder,Video,210,10 104,Tennis Racket,Sports,190,20 [root@localhost ~]# awk 'BEGIN{IGNORECASE=1} /video/{print}' items.txt 101,HD Camcorder,Video,210,10
Copyright © Linux教程網 All Rights Reserved