awk 脚本中拒绝有效的 Linux 命令

awk 脚本中拒绝有效的 Linux 命令

测试命令为:

$ if echo 'abcd' | grep  -q '[a-zA-Z]'; then echo 'alpha'; fi

我从终端获得了预期的“alpha”。

但是当我将命令放入文本文件 akpl.awk 并运行时

$ awk -f akpl.awk sppl.txt

我收到错误信息。

我正在尝试计算 sppl.txt 中每行第 5 个字段中的字母条目,因此“abcd”通常会被 $5 替换

顺便问一下,这是一种使用正则表达式检查字符串的合理方法吗?

答案1

awk 脚本里面的命令必须是有效的 awk 命令,而不是有效的 shell 命令。

虽然它确实具有通过函数执行外部命令的机制system(),或者使用getline管道或协同进程,但这些机制很少使用。对于简单的文本处理任务,awk 的内置功能通常就足够了。

特别是,GNU awk(gawk)——Ubuntu 当前版本中的默认版本——具有与 POSIX 扩展正则表达式 (ERE) 语法大致相当的正则表达式匹配功能,因此您通常可以避免使用grep。例如,给定

$ cat myscript.awk 
$5 ~ /[a-zA-Z]/ {print "Line " FNR ": alpha"}

$ cat file.txt
A B C D E F G H
1 2 3 4 5 6 7 8
a b c d e f g h

然后

$ awk -f myscript.awk file.txt
Line 1: alpha
Line 3: alpha

相关内容