awk 缓冲区大小

awk 缓冲区大小

我今天注意到这组有趣的命令:

$ seq 5 > alfa.txt
$ awk '{print 6 > ARGV[1]} 1' alfa.txt
1
2
3
4
5

$ cat alfa.txt
6
6
6
6
6

我的第一个问题是为什么我得到了几个6而不是一个,但后来我记得你每次都需要关闭:

awk '{print 6 > ARGV[1]; close(ARGV[1])} 1' alfa.txt

然而,同样让我困惑的是,如果我从一开始就破坏输入,我如何仍然能够浏览并读取整个文件?我的猜测是,Awk 实际上正在写入缓冲区,然后在最后或可能每次缓冲区填满时写入实际文件。

如果后者为真,则缓冲区大小是多少?

答案1

它依赖于实现,但是您会看到 awk 在打开其输入后打开输出文件。原始输入文件丢失,除了 awk 读取的打开文件描述符之外。

这不仅仅是 awk 可以做到这一点:它对于许多应用程序来说都很常见......

ps:缓冲区是您的磁盘(无法从问题中确定大小)。

答案2

至少在我的系统上,它似乎是来自文件的 32768,以及来自管道的 65536:

$ yes | head -100000 | tee file > pipe

$ awk '{print "n" > ARGV[1]}' file

$ sed s/y/n/ pipe | awk 'BEGIN {while (getline < "-") print > ARGV[1]}' pipe

$ wc -l file pipe
 32768 file
 65536 pipe

相关内容