awk常用的内置变量

对于awk来说“变量”又分为“内置变量”和“自定义变量”,“输入分隔符FS”和“输出分隔符OFS”都属于内置变量。

内置变量就是awk预定义好的,内置在awk内部的变量,而自定义变量就是用户定义的变量。

 

我们先看看awk常用的一些内置变量及其作用:

FS:输入字符风隔符,默认为空白字符

OFS:输出字段分隔符,默认为空白 字符

RS:输入记录分隔符(输入换行符),指定输入时的额换行符

NF:number of Field,当前行的字段的个数,字段数量

NR:行号,当前处理的文本行的行号

FNR:各文件分别计数的行号

FILENAME:当前文件名

ARGC:命令行参数的个数

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

内置变量


内置变量NR

首先我们看一下NR的例子:

test文件中一共有两行文本,使用空格隔开,第一行有4列,第二行有5列

 

而内置变量NR每一行的行号,内置变量NF表示每一行中一共有几列,我们试试怎么得到每一行的行号以及每一行对应的列数量。

 

或者,我们试试利用NR内置变量。先打印行号,再打印出整行的内容,然后在添加行号进行输出:


内置变量FNR

让我们试试使用awk同时处理多个文件,并且使用NR显示行号:

 

 

再试试如何利用内置变量FNR显示两个文件的行号:

 

它的作用就是当awk处理多个文件是,分别对每个文件的行数进行计数。


内置变量RS

 现在我们来看看RS这个变量,RS是输入行分隔符,默认的“行分隔符”就是“回车换行”。

我们试试让awk以为每次遇到一个空格就是新的一行,怎么做呢?例:

我们先使用了默认的“回车换行”作为“行分隔符”输出test1文本,这时显示文本一共有2行。

我们又指定了使用“空格”作为“行分隔符”输出test1文本,这时显示一共8行。

当我们指定使用空格作为“行分隔符”时,在awk解析文本时,每当遇到空格,awk就认为遇到的空格是换行符,于时awk就将文本换行了,而此时人类理解的“回车换行”,对于awk来说并不是所谓的换行符,所以才会出现上图中第4行的现象,即使我们看是两行文本,但是awk的世界观里,他就是一行。

这就是输入行分隔符的使用方法,同理,我们来看看“输出行分隔符”。

内置变量ORS

默认情况下,awk将人类眼中的“回车换行”,当做“输出行分隔符”,此时,awk的“世界观”与我们的“世界观”是相同的。

现在,我们改变一下awk的想法,我们让awk认为“+++”是真正的输出行分隔符。如图:

我们制定了“行输出行分隔符”为“+++”那么,当awk在输出文字的时候,如果想要换行,就会“另起一行(+++)”,所以,对于awk来说。它完成了“另起一行”的动作,只不过他所认为的“另起一行”的动作输出为“+++”而不再是原来的输出“回车换行”。

我们试试“输出换行符”和“输入换行符”同时使用,看看什么效果,如图:

内置变量FILENAME

FILENAME这个内置变量,从字面上就能看出是什么意思,就是显示文件名,如图:

内置变量ARGC与AEGV

ARGC内置变量表示命令行参数的个数,什么意思呢?我们先看看ARGV。

别看错了啊。

一个是ARGC,

一个是ARGV,

先看看ARGV。

ARGV内置变量表示是一个数组,这个数组中保存的是命令行所给定的参数,来,我们看看示例:

上边的示例,我们先使用BEGIN模式,输出字符串“aaa”,然后,传入两个文件的文件名作为参数,我们发现,BEGIN模式正常执行了打印动作,输出“aaa”字符串,我们使用同样的命令,同样使用BEGIN模式,只不过,这次不只打印“aaa”,还打印ARGV这个数组中第二元素的值。

ARGV表示的是一个数组,就需要引用元素的值,ARGV内置变量表示的是:所有参数组成的数组。如果是ARGV【0】对应的是哪个参数呢?看图!

第一个参数就是AWK本身,awk就是这么规定的,'pattern{action}'并不被看做是参数,awk被看为参数。

来,我们在看看ARGC变量的作用,

在刚才的例子中,应该有三个参数,awk,test1,test,这三个参数作为数组的元素存放于ARGV中,现在,而ARGC则表示参数的数量,也可以理解为ARGV数组的长度,看图!

自定义变量

顾名思义,就是用户定义的变量,有两种方法可以自定义变量。

方法一:-v varname=value 变量区分字符大小写。

方法二:在program中直接定义。

我们看一些例子,就能明白这两种方法。看图!

通过方法一自定义变量。

方法二自定义变量,直接在program中定义即可,注意变量定义与动作之间需要用分号“;”隔开。

也可以一次性定义多个变量:

 

方法一看上去比较麻烦,但是这种方法也有自己的优势

当我们需要在AWK中引用shell中的变量的时候,则可以通过这种方法间接的引用,看图!

在 `awk` 中引入变量的方式主要有以下几种,每种方式适用于不同的使用场景。 ### 在命令行中传递变量 可以在命令行中直接定义变量,并在 `awk` 脚本中使用这些变量。需要注意的是,变量的定义必须放在文件名之前,否则变量无法被正确识别。例如: ```bash awk '{print a, b}' a=111 b=222 yourfile ``` 上述方式适用于简单的变量传递,但在 `BEGIN` 块中无法直接访问这些变量。为了在 `BEGIN` 块中使用这些变量,需要使用 `-v` 参数显式传递: ```bash awk -v a=111 -v b=222 '{print a, b}' yourfile ``` 每定义一个变量,都需要加上 `-v` 参数[^1]。 ### 调用环境变量 如果需要在 `awk` 中使用环境变量,可以通过字符串拼接的方式实现。例如,使用 `LOGNAME` 环境变量: ```bash awk '{print "'"$LOGNAME"'"}' yourfile ``` 这种方式通过在 `awk` 的 `print` 语句中嵌入外部变量的值来实现环境变量的调用。对于字符串类型的变量,这种形式尤为常用[^5]。 ### 使用内置变量 `awk` 提供了许多内置变量,例如 `FS`(输入字段分隔符)、`OFS`(输出字段分隔符)、`RS`(记录分隔符)等。这些变量通常在 `BEGIN` 块中进行设置,以控制 `awk` 的行为。例如: ```bash awk 'BEGIN {FS=","; OFS=":"} {print $1, $2}' yourfile ``` 上述命令将输入字段分隔符设置为逗号,并将输出字段分隔符设置为冒号。内置变量的使用不需要额外的参数传递[^3]。 ### 在 `awk` 脚本中定义变量 除了在命令行中传递变量外,还可以在 `awk` 脚本内部定义和使用变量。例如: ```bash awk 'BEGIN {a=111; b=222} {print a, b}' yourfile ``` 这种方式适用于变量值在脚本内部定义的情况,无需从外部传递变量。 ### 示例:在 `BEGIN` 块中使用外部变量 当需要在 `BEGIN` 块中使用外部变量时,必须使用 `-v` 参数显式传递: ```bash awk -v a=123 -v b=456 'BEGIN {print a, b}' yourfile ``` 上述命令将变量 `a` 和 `b` 的值传递到 `BEGIN` 块中,并在脚本执行前打印这些变量的值[^5]。 ### 总结 `awk` 提供了多种方式引入变量,包括命令行变量传递、环境变量调用、内置变量使用以及脚本内部定义。不同的场景需要使用不同的方法,例如在 `BEGIN` 块中使用变量时,推荐使用 `-v` 参数传递变量值。这些方法使得 `awk` 在处理文本时更加灵活和强大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值