Linux awk 8个强大的内置变量
awk 有几个强大的内置变量。awk 中有两种类型的内置变量。
- 定义可以更改的值的变量,例如字段分隔符和记录分隔符。
- 可用于处理和报告的变量,例如记录数、字段数。
1. awk FS 示例:输入字段分隔符变量。
awk 默认根据空白字符从输入中读取并解析每一行,并设置变量 $1、$2 等。awk FS 变量用于设置每条记录的字段分隔符。awk FS 可以设置为任何单个字符或正则表达式。您可以使用以下两个选项之一来使用输入字段分隔符:
- 使用 -F 命令行选项。
- 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。
- 点赞
- 收藏
- 关注作者
评论(0)