简单的AWK示例在哪里开始?

时间:2009-02-06 23:27:12

标签: awk

我的所有代码都失败了。他们应分别打印“他”,“你好”和“5 \ n 3”:

awk -v e='he' {print $e}       // not working, why?
awk NF { print hello }
awk { print ARGV[5,3] }

是否有一些关于AWK的简单示例?

5 个答案:

答案 0 :(得分:3)

对于第一个,你不要在awk中使用$作为变量,试试这个:

fury> echo | awk -v e='he' '{print e}'
he

对于第二个,你的条件NF意味着NF!= 0所以它只会打印非空行:

fury> echo | awk 'NF {print "hello"}'
fury> echo "7 8" | awk 'NF {print "hello"}'
hello

我从未见过你的第三个语法,ARGV是一个单维数组,所以你可以使用:

fury> awk 'BEGIN {print ARGV[5]}' 1 2 3 4 5 6 7
5
fury> awk 'BEGIN {print ARGV[5] "\n" ARGV[3]}' 1 2 3 4 5 6 7
5
3

注意我正在为第三个使用BEGIN块,否则它将尝试打开并处理1,2,3,...作为文件。

答案 1 :(得分:3)

首先,基本的shell脚本健全性:

  • 始终将您的脚本用单引号括起来

请注意,脚本是单个参数 - 或带有“-f file”的文件名。

awk脚本是一系列“<pattern> <action>”对。为了清楚起见,该操作用括号“{}”括起来 - 再次是理智。

正如Pax所说,第一个例子应该是:

awk -v -e e='he' '{ print e }'

第二个例子是不可思议的 - 你可能意味着:

awk '{ print "hello" }'

变量NF是该行上的字段数。你可能会得到解释

awk 'NF { print "hello" }'

好像输入行上有任何数据(NF!= 0,或字段数不为零),然后打印'hello'。

最后一个例子同样难以理解; ARGV是'awk'的参数数组,命令行没有提供。但它是一维数组。您的子脚本编号表示希望将其视为Python字典或Perl哈希,并将两个索引组合在一起。你没关系 - awk支持关联数组;但由于你没有在ARGV [5,2]的数组中添加任何内容,因此它不会打印任何内容。

答案 2 :(得分:2)

尝试:

echo "hello" | awk ' {print $0} '
echo "hello" | awk ' {print $1} '

请注意,$ 0返回整个记录,$ 1只返回第一个条目; awk在1开始计数。所以

echo "hello1 hello2 hello3" | awk ' {print $0} '

返回hello1 hello2 hello3。而

echo "hello1 hello2 hello3" | awk ' {print $3} '

将返回hello3

我喜欢这个awk tutorial.

答案 3 :(得分:1)

我使用此site. O'Reilly Sed & Awk书也很好。

答案 4 :(得分:1)

此外,http://awk.info

提供了大量有用的信息和教程