awk的一些疑问和验证(GNU gawk)
gawk和awk的关系,实际上都是gawk,后者只是一个前者的符号链接
-v参数是怎么用的
1、 没有这个参数是不可以在命令行下面初始化变量的,eg:
awk -f prob month=10 year=10 facts #得不到任何结果
2、 如果放在文件名的后面也是不行的,eg:
awk -f prob facts -v month=10 -v year=10 #得不到任何结果
3、 每一个变量名前面都需要有-v前导,否则该变量名仍旧没有被初始化,eg:
awk -f prob -v month=10 year=10 facts #year没有被初始化
4、 给出一个正确的例子,eg:
awk -f prob -v month=10 -v year=10 facts #month和year变量都被初始化了
范围模式可以使用表达式么:可以,eg:
awk '$0 == 3, $0 == 4' testfile #发现3,然后打印到发现4为止
==到底匹配了字符串还是模式:字符串,eg:
xxx@xxx:~/testdir/awk> cat testfile
123456abc
xxx@ xxx:~/testdir/awk> awk '$0 == "abc"' testfile
xxx @ xxx:~/testdir/awk> awk '$0 ~ "abc"' testfile
123456abc
awk '{ "cat testfile" | getline d; print d}' testfile的解释,实际上是为了解释这个管道"|"
首先执行cat命令,将文件全部给了一个匿名管道,然后每处理一个testfile的记录都从这个管道里面读取一行,然后输出。并不是每次都会将cat命令执行一次,都输出第一行。
同理,重定向(>)也是整个awk仅执行一次(不是每一个记录执行一次),因此以下命令行:
awk '{ "cat testfile" | getline d; print d > "testfile2"}' testfile
完成的功能是将testfile拷贝到2,附加重定向(>>)同理。