linux中awk的基本格式是什么
这篇文章主要为大家展示了"linux中awk的基本格式是什么",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"linux中awk的基本格式是什么"这篇文章吧。
介绍了 awk
命令的基本格式:
$ awk [选项] '模式 {动作}' 输入文件
awk
是一个命令,后面要接选项 (比如用 -F
来定义字段分隔符)。想让 awk
执行的部分需要写在两个单引号之间,至少在终端中需要这么做。在 awk
命令中,为了进一步强调你想要执行的部分,可以用 -e
选项来突出显示(但这不是必须的):
$ awk -F, -e '{print $2;}' colours.txtyellowbluegreen[...]
记录和字段
awk
将输入数据视为一系列记录,通常是按行分割的。换句话说,awk
将文本中的每一行视作一个记录。每一记录包含多个字段。一个字段由字段分隔符分隔开来,字段是记录的一部分。
默认情况下,awk
将各种空白符,如空格、制表符、换行符等视为分隔符。值得注意的是,在 awk
中,多个空格将被视为一个分隔符。所以下面这行文本有两个字段:
raspberry red
这行也是:
tuxedo black
其他分隔符,在程序中不是这么处理的。假设字段分隔符是逗号,如下所示的记录,就有三个字段。其中一个字段可能会是 0 个字节(假设这一字段中不包含隐藏字符)
a,,b
awk 程序
awk
命令的程序部分是由一系列规则组成的。通常来说,程序中每个规则占一行(尽管这不是必须的)。每个规则由一个模式,或一个或多个动作组成:
模式 { 动作 }
在一个规则中,你可以通过定义模式,来确定动作是否会在记录中执行。模式可以是简单的比较条件、正则表达式,甚至两者结合等等。
这个例子中,程序只会显示包含单词 "raspberry" 的记录:
$ awk '/raspberry/ { print $0 }' colours.txtraspberry red 99
如果没有文本符合模式,该动作将会应用到所有记录上。
并且,在一条规则只包含模式时,相当于对整个记录执行 { print }
,全部打印出来。
Awk 程序本质上是数据驱动的,命令执行结果取决于数据。所以,与其他编程语言中的程序相比,它还是有些区别的。
NF 变量
每个字段都有指定变量,但针对字段和记录,也存在一些特殊变量。NF
变量,能存储 awk
在当前记录中找到的字段数量。其内容可在屏幕上显示,也可用于测试。下面例子中的数据,来自上篇文章文本:
$ awk '{ print $0 " (" NF ")" }' colours.txtname color amount (3)apple red 4 (3)banana yellow 6 (3)[...]
awk
的 print
函数会接受一系列参数(可以是变量或者字符串),并将它们拼接起来。这就是为什么在这个例子里,每行结尾处,awk
会以一个被括号括起来的整数表示字段数量。
NR 变量
另外,除了统计每个记录中的字段数,awk
也统计输入记录数。记录数被存储在变量 NR
中,它的使用方法和其他变量没有任何区别。例如,为了在每一行开头显示行号:
$ awk '{ print NR ": " $0 }' colours.txt1: name color amount2: apple red 43: banana yellow 64: raspberry red 35: grape purple 10[...]
注意,写这个命令时可以不在 print
后的多个参数间添加空格,尽管这样会降低可读性:
$ awk '{print NR": "$0}' colours.txt
printf() 函数
为了让输出结果时格式更灵活,你可以使用 awk
的 printf()
函数。 它与 C、Lua、Bash 和其他语言中的 printf
相类似。它也接受以逗号分隔的格式参数。参数列表需要写在括号里。
$ printf 格式, 项目1, 项目2, ...
格式这一参数(也叫格式符)定义了其他参数如何显示。这一功能是用格式修饰符实现的。%s
输出字符,%d
输出十进制数字。下面的 printf
语句,会在括号内显示字段数量:
$ awk 'printf "%s (%d)\n",$0,NF}' colours.txtname color amount (3)raspberry red 4 (3)banana yellow 6 (3)[...]
在这个例子里,%s (%d)
确定了每一行的输出格式,$0,NF
定义了插入 %s
和 %d
位置的数据。注意,和 print
函数不同,在没有明确指令时,输出不会转到下一行。出现转义字符 \n
时才会换行。
Awk 脚本编程
这篇文章中出现的所有 awk
代码,都在 Bash 终端中执行过。面对更复杂的程序,将命令放在文件(脚本)中会更容易。-f FILE
选项(不要和 -F
弄混了,那个选项用于字段分隔符),可用于指明包含可执行程序的文件。
举个例子,下面是一个简单的 awk 脚本。创建一个名为 example1.awk
的文件,包含以下内容:
/^a/ {print "A: " $0}/^b/ {print "B: " $0}
如果一个文件包含 awk
程序,那么在给文件命名时,最好写上 .awk
的扩展名。 这样命名不是强制的,但这么做,会给文件管理器、编辑器(和你)一个关于文件内容的很有用的提示。
执行这一脚本:
$ awk -f example1.awk colours.txtA: raspberry red 4B: banana yellow 6A: apple green 8
一个包含 awk
命令的文件,在最开头一行加上释伴 #!
,就能变成可执行脚本。创建一个名为 example2.awk
的文件,包含以下内容:
#!/usr/bin/awk -f## 除了第一行,在其他行前显示行号# NR > 1 { printf "%d: %s\n",NR,$0}
可以说,脚本中只有一行,大多数情况下没什么用。但在某些情况下,执行一个脚本,比记住,然后打一条命令要容易的多。一个脚本文件,也提供了一个记录命令具体作用的好机会。以 #
号开头的行是注释,awk
会忽略它们。
给文件可执行权限:
$ chmod u+x example2.awk
执行脚本:
$ ./example2.awk colours.txt2: apple red 42: banana yellow 64: raspberry red 35: grape purple 10[...]
将 awk
命令放在脚本文件中,有一个好处就是,修改和格式化输出会更容易。在终端中,如果能用一行执行多条 awk
命令,那么输入多行,才能达到同样效果,就显得有些多余了。
以上是"linux中awk的基本格式是什么"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!