Awk

awk 緩衝區大小

  • August 18, 2018

我今天注意到了這組有趣的命令:

$ 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 實際上是在寫入緩衝區,然後在最後或者每次緩衝區填滿時寫入實際文件。

如果後者為真,那麼緩衝區大小是多少?

至少在我的系統上,它似乎是來自文件的 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

它依賴於實現,但您會看到 awk 在打開其輸入後打開輸出文件。原始輸入文件失去,除了它讀取的 awk 的打開文件描述符。

這不僅僅是 awk 可以做到這一點:它對許多應用程序都很常見……

ps:緩衝區是您的磁碟(大小無法從問題中確定)。

引用自:https://unix.stackexchange.com/questions/463366