Linux awk 8个强大的内置变量

举报
Tiamo_T 发表于 2022/01/25 08:26:34 2022/01/25
【摘要】 awk 有几个强大的内置变量。awk 中有两种类型的内置变量。 定义可以更改的值的变量,例如字段分隔符和记录分隔符。 可用于处理和报告的变量,例如记录数、字段数。

awk 有几个强大的内置变量。awk 中有两种类型的内置变量。

  1. 定义可以更改的值的变量,例如字段分隔符和记录分隔符。
  2. 可用于处理和报告的变量,例如记录数、字段数。


1. awk FS 示例:输入字段分隔符变量。

awk 默认根据空白字符从输入中读取并解析每一行,并设置变量 $1、$2 等。awk FS 变量用于设置每条记录的字段分隔符。awk FS 可以设置为任何单个字符或正则表达式。您可以使用以下两个选项之一来使用输入字段分隔符:

  1. 使用 -F 命令行选项。
  2. awk FS 可以像普通变量一样设置。
Syntax:

$ awk -F 'FS' 'commands' inputfilename

(or)

$ awk 'BEGIN{FS="FS";}'
  • awk FS是您想要用作输入字段分隔符的任何单个字符或正则表达式。
  • awk FS可以多次更改,它会保留其值,直到显式更改。如果要更改字段分隔符,最好在阅读该行之前更改。因此,该更改会影响您阅读的内容。

这是一个 awk FS 示例,用于读取以“:”作为字段分隔符的 /etc/passwd 文件。

$ cat etc_passwd.awk
BEGIN{
FS=":";
print "Name\tUserID\tGroupID\tHomeDirectory";
}
{
	print $1"\t"$3"\t"$4"\t"$6;
}
END {
	print NR,"Records Processed";
}
$awk -f etc_passwd.awk /etc/passwd
Name    UserID  GroupID        HomeDirectory
gnats	41	41	/var/lib/gnats
libuuid	100	101	/var/lib/libuuid
syslog	101	102	/home/syslog
hplip	103	7	/var/run/hplip
avahi	105	111	/var/run/avahi-daemon
saned	110	116	/home/saned
pulse	111	117	/var/run/pulse
gdm	112	119	/var/lib/gdm
8 Records Processed

2. awk OFS 示例:输出字段分隔符变量

awk OFS是 awk FS 变量的输出等价物。默认情况下,awk OFS 是单个空格字符。以下是一个 awk OFS 示例。

$ awk -F':' '{print $3,$4;}' /etc/passwd
41 41
100 101
101 102
103 7
105 111
110 116
111 117
112 119

打印语句“,”中的连接符将两个参数与一个空格连接起来,该空格是默认情况下 awk OFS 的值。因此,Awk OFS 值将插入输出中的字段之间,如下所示。

$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd
41=41
100=101
101=102
103=7
105=111
110=116
111=117
112=119

3. awk RS 示例:记录分隔符变量

awk RS定义了一条线。awk 默认逐行读取。


让我们把学生的分数存储在一个文件中,每条记录用双换行符分隔,每个字段用换行符分隔。

$cat student.txt
Jones
2143
78
84
77

Gondrol
2321
56
58
45

RinRao
2122
38
37
65

Edwin
2537
78
67
45

Dayan
2415
30
47
20

现在下面的 Awk 脚本从上面的输入文件中打印学生姓名和 Rollno。

$cat student.awk
BEGIN {
	RS="\n\n";
	FS="\n";

}
{
	print $1,$2;
}

$ awk -f student.awk  student.txt
Jones 2143
Gondrol 2321
RinRao 2122
Edwin 2537
Dayan 2415

在脚本 student.awk 中,它将每个学生详细信息作为单个记录读取,因为 awk RS 已分配给双换行符,并且记录中的每一行都是一个字段,因为 FS 是换行符。

4. awk ORS 示例:输出记录分隔符变量

awk ORS是 RS 的输出等价物。输出中的每条记录都将使用此分隔符打印。以下是一个 awk ORS 示例:

$  awk 'BEGIN{ORS="=";} {print;}' student-marks
Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=

在上述脚本中,student-marks 文件中的每条记录由字符“=”分隔。

5. awk NR 示例:记录数变量

awk NR为您提供正在处理的记录总数或行号。在以下 awk NR 示例中,NR 变量具有行号,在 END 部分中,awk NR 告诉您文件中的记录总数。

$ awk '{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}' student-marks
Processing Record -  1
Processing Record -  2
Processing Record -  3
Processing Record -  4
Processing Record -  5
5 Students Records are processed

6. awk NF 示例:记录中的字段数

awk NF为您提供记录中的字段总数。awk NF 对于验证记录中是否存在所有字段非常有用。

让我们看一下 student-marks 文件,如下所示,学生的 Test3 分数是缺失的。

$cat student-marks
Jones 2143 78 84 77
Gondrol 2321 56 58 45
RinRao 2122 38 37
Edwin 2537 78 67 45
Dayan 2415 30 47

以下 awk 脚本打印记录(行)号和该记录中的字段数。所以很容易发现缺少Test3分数。

$ awk '{print NR,"->",NF}' student-marks
1 -> 5
2 -> 5
3 -> 4
4 -> 5
5 -> 4

7. awk FILENAME 示例:当前输入文件的名称

FILENAME 变量给出正在读取的文件的名称。awk 可以接受要处理的输入文件的数量。

$ awk '{print FILENAME}' student-marks
student-marks
student-marks
student-marks
student-marks
student-marks

在上面的示例中,它为输入文件的每条记录打印 FILENAME 即学生标记。

8. awk FNR 示例:相对于当前输入文件的记录数

当 awk 从多个输入文件中读取时,awk NR 变量将给出相对于所有输入文件的记录总数。awk FNR将为您提供每个输入文件的记录数。

$ awk '{print FILENAME, FNR;}' student-marks bookdetails
student-marks 1
student-marks 2
student-marks 3
student-marks 4
student-marks 5
bookdetails 1
bookdetails 2
bookdetails 3
bookdetails 4
bookdetails 5

在上面的示例中,如果您使用 awk NR,而不是 awk FNR,则对于文件 bookdetails,您将获得每条记录的 6 到 10。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。