This article is part of 的on-going Awk教程示例 系列。 Awk具有几个强大的内置变量。 Awk中有两种内置变量。
- 用于定义可以更改的值的变量,例如字段分隔符和记录分隔符。
- 可用于处理和报告的变量,例如记录数,字段数。
1. Awk FS 示例:输入字段分隔符变量。
默认情况下,Awk基于空格字符从输入中读取并解析每一行,并设置变量$ 1,$ 2等。AwkFS变量用于为每个记录设置字段分隔符。 Awk FS 可以设置为任何单个字符或正则表达式。您可以使用以下两个选项之一来使用输入字段分隔符:
- 使用-F命令行选项。
- 可以像普通变量一样设置Awk FS。
Syntax: $ awk-F 'FS' 'commands' inputfilename (or) $ awk'BEGIN{FS="FS";}'
- Awk FS 是要用作输入字段分隔符的任何单个字符或正则表达式。
- Awk FS 可以多次更改,它会保留其值,直到明确更改为止。如果要更改字段分隔符,最好在阅读该行之前进行更改。因此,更改会影响您所阅读的内容。
Here is an awkFS example to read 的/etc/passwd file which has “:” as field delimiter.
$ cat etc_passwd.awk BEGIN{ FS=":"; print " 名称 \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 家 Directory 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
Now 的below Awk script prints 的Student name and Rollno from 的above input file.
$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 is an Output equivalent of RS. Each record in 的output will be printed with this delimiter. Following is an awkORS example:
$ 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=
In 的above script,each records in 的file student-marks file is delimited 通过 的character “=”.
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 gives you 的total number of fields in a record. Awk NF will be very useful for validating whether all 的fields are exist in a record.
Let us take in 的student-marks file, Test3 score is missing for to students as shown below.
$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示例: 名称 of 的current input file
FILENAME variable gives 的name of 的file being read. Awk can accept number of input files to process.
$ awk'{print FILENAME}' student-marks student-marks student-marks student-marks student-marks student-marks
In 的above example, it prints 的FILENAME 即 student-marks for each record of 的input file.
8. Awk FNR 示例: Number of Records relative to 的current input file
When awkreads from 的multiple input file, awkNR variable will give 的total number of records relative to all 的input file. 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
In 的above example, instead of awkFNR, if you use awkNR, for 的file bookdetails 的you will get from 6 to 10 for each record.
推荐读物
Sed和Awk 101骇客,作者:Ramesh Natarajan。我每天在UNIX / Linux环境上花费数小时来处理文本文件(数据,配置和日志文件)。我所有的文本处理工作都使用Sed和Awk。根据我在Sed和Awk的经验,’编写了Sed和Awk 101 Hacks电子书,其中包含有关Sed和Awk各种高级功能的101个实用示例,这些示例将延长UNIX / Linux的寿命。即使您已经使用Sed和Awk已有数年并且没有读过这本书,也请您帮个忙并阅读这本书。 Sed和Awk实用程序的功能会让您惊讶。
如果您喜欢这篇文章,您可能还会喜欢..
![]() |
![]() |
![]() |
![]() |
感谢您发布好文章。