tac 命令的選項創建奇怪的輸出

tac 命令的選項創建奇怪的輸出

假設我有這個文件,只包含

a
b
c
b
a

在 BASH 中使用tac --separator=a file[在基於 Debian 的 Linux 上],我得到以下資訊:

                  # empty line
                  # empty line
b
c
b
aacommand@prompt  # two a just before the prompt


問題:據我了解,--separator=a定義a標記字串內的中斷,而不是newline.這是正確的嗎?

我已經嘗試過使用其他字串進行更多輸入,但結果卻很混亂。我認為其他選項都工作得很好:如果我使用,tac --before我首先會得到大約五比一的空行,但這就是應該發生的事情,對吧?

答案1

tac在其主要設計用途的情況下更容易理解,即當分隔符號是記錄終止符時,即分隔符號出現在最後一筆記錄之後。它以相反的順序列印記錄(包括每個終止符)。

$ echo -n fooabara | tac -s a; echo
rabafooa

輸入由三個記錄(foobr)組成,每個記錄後面跟著分隔符號a;輸出由三個記錄(rbfoo)組成,每個記錄後面跟著分隔符號a

如果最後一筆記錄不以記錄終止符結尾,則仍先列印它,不帶記錄分隔符號。

$ echo -n fooabar | tac -s a; echo
rbafooa

最後一筆記錄r最終與倒數第二筆記錄連接在一起,b中間沒有分隔符,因為最後一筆記錄的末尾沒有分隔符。

由於換行符,您的輸入看起來有點混亂。讓我們用逗號而不是換行符號來查看它:

$ echo -n a,b,c,b,a, | tac -s a; echo
,,b,c,b,aa

有三個輸入記錄:一個空記錄(帶有終止符a)、大記錄,,b,c,b,(同樣帶有終止符)和一個,末尾未終止的記錄。這些記錄(每個記錄都有終止符,除了最後一條沒有終止符的記錄)以相反的順序列印。

您的困惑可能來自於期望“分隔符號”是一個分隔符號 - 但這是用詞不當:它實際上是一個記錄終止符。--before使其成為發起者。

答案2

以下範例可能有助於使用該--regex選項:

$ cat records 
---1---
1
2
3
---2
A
B
C
---3--
a
b
c
$ tac --before --regex --separator=^---[0-9]+-*$ records
---3--
a
b
c
---2
A
B
C
---1---
1
2
3

在此範例中,檔案records包含多行記錄,每行記錄都以 開頭的行 ( ^...$) 開始---,後面跟著數字 ( [0-9]+) 和可選的減號序列 ( -*)。我們可以看到每筆記錄中的行順序及其標題行都被保留。

我使用tac這種方式以相反的順序顯示日誌檔案條目,如 Twitter 等提要應用程式中所使用的那樣。例如,僅以相反順序列印最後兩筆記錄:

tac --before --regex --separator=^---[0-9]+-*$ example \
 | awk '/^---[0-9]+-*$/ {c++} c>2 {exit}{print}'

相關內容