未加星标

Linux高级文本处理之gawk内置变量

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二05 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏
一、FS 输入字段分隔符

FS是awk内置变量,用来制定行分隔符,功能能-F一样,区别在于FS只能用在BEGIN语句块当中,命令格式如下:

BEGIN{FS="SEPARATOR"} 实例1: [[email protected] ~]# 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: [[email protected] ~]# 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
[[email protected] ~]# 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: [[email protected] ~]# 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

注意与下面情况区分,如下情况会多输出空格字符:

[[email protected] ~]# awk -F, '{print $2,":",$3}' emp
John Doe : CEO
Jason Smith : IT Manager
Raj Reddy : Sysadmin
Anand Ram : Developer
Jane Miller : Sales Manager 实例3:使用逗号与不使用逗号的区别 [[email protected] ~]# awk 'BEGIN{print "text1","text2"}' #使用逗号默认使用OFS
text1 text2
[[email protected] ~]# awk 'BEGIN{print "text1""text2"}' #不使用逗号默认不使用OFS
text1text2 三、RS 记录分隔符

Awk 默认的记录分隔符是换行符。

实例1:将文件emp2内容作为 5 行记录来处理(而不是单独的一行), 并且打印每条记录中雇员的姓名 [[email protected] ~]# cat emp2
101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller
[[email protected] ~]# awk -F, 'BEGIN{RS=":"}{print $2}' emp2 #将冒号结尾当做一行处理
John Doe
Jason Smith
Raj Reddy
Anand Ram
Jane 实例2:打印emp3文件中雇员名称和职位 [[email protected] ~]# cat emp3
101
John Doe
CEO
-
102
Jason Smith
IT Manager
-
103
Raj Reddy
Sysadmin
-
104
Anand Ram
Developer
-
105
Jane Miller
Sales Manager
[[email protected] ~]# 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:在每个输出行后面追加"---------" [[email protected] ~]# cat emp
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
[[email protected] ~]# 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:把每个字段打印成单独一行,每条记录用”---“分隔 [[email protected] ~]# 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:多文件打印行号 [[email protected]~]#awk'{printNR,$1}'empemp11101,John2102,Jason3103,Raj4104,Anand5105,Jane6101,John7102,Jason8103,Raj9104,Anand10105,Jane 实例2: [[email protected] ~]# 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 [[email protected] ~]# 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: [[email protected] ~]# cat emp
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
[[email protected] ~]# cat emp2
101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller
[[email protected] ~]# 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 的值将会是"-"。

实例二:从标准输入获取内容 [[email protected] ~]# awk '{print "Last name",$2;print "Filename:",FILENAME}'
John Deo
Last name Deo
Filename: -

管道一样:

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

注意:在 BEGIN 区域内, FILENAME 的值是空,因为 BEGIN 区域只针对 awk 本身,而不处理任何文件。

[[email protected] ~]# 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 [[email protected] ~]# 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: [[email protected] ~]# head -1 /etc/passwd
root:x:0:0:young,geek,010110110,0101101101:/root:/bin/bash
[[email protected] ~]# head -1 /etc/passwd|awk -F: '{print NF}'
7 九、ARGC - 命令行参数的个数

ARGC表示命令行中awk命令后面跟的参数的个数,包含awk命令自身。

实例1: [[email protected] ~]# awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab
3
[[email protected] ~]# awk 'BEGIN {print ARGC}' /etc/fstab
2
[[email protected] ~]# awk 'BEGIN {print ARGC}' 十、ARGV - 命令行保存参数内容

ARGV:数组,保存的是命令行所给定的各参数。

实例1: [[email protected] ~]# awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/passwd #awk命令自身也包括
awk
[[email protected] ~]# awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/passwd
/etc/fstab
[[email protected] ~]# awk 'BEGIN {print ARGV[2]}' /etc/fstab /etc/passwd
/etc/passwd 十一、$NF - 最后字段内容

$NF表示每行的最后一个字段的内容

实例1: [[email protected] ~]# head -1 /etc/passwd
root:x:0:0:young,geek,010110110,0101101101:/root:/bin/bash
[email protected] ~]# head -1 /etc/passwd|awk -F: '{print $NF}'
/bin/bash
[[email protected] ~]# head -1 /etc/passwd|awk -F: '{print $(NF-1)}'
/root
[[email protected] ~]# head -1 /etc/passwd|awk -F: '{print $(NF-2)}'
young,geek,010110110,0101101101 十二、IGNORECASE - 忽略大小写

默认情况下, IGNORECASE 的值是 0 ,所有 awk 区分大小写。当把 IGNORECASE 的值设置为 1 时, awk 则不区分大小写,这在使用正则表达式和比较字符串时很有效率。

实例1: [[email protected]~]

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: Linux变量EPA
分页:12
转载请注明
本文标题:Linux高级文本处理之gawk内置变量
本站链接:http://www.codesec.net/view/530697.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(84)