linux的内部变量$0,Linux高级文本处理之gawk内置变量

一、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:多文件打印行号

实例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:

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值