假設我有這個文件,只包含
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
輸入由三個記錄(foo
、b
和r
)組成,每個記錄後面跟著分隔符號a
;輸出由三個記錄(r
、b
和foo
)組成,每個記錄後面跟著分隔符號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}'