测试命令为:
$ 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