다음 내용만 포함된 파일이 있다고 가정해 보겠습니다.
a
b
c
b
a
tac --separator=a file
[Debian 기반 Linux에서] BASH를 사용하면 다음을 얻습니다.
# empty line
# empty line
b
c
b
aacommand@prompt # two a just before the prompt
질문: 내가 이해하는 바에 --separator=a
따르면 a
.newline
이 올바른지?
더 많은 입력을 위해 다른 문자열을 사용해 보았으나 결과가 지저분합니다. 다른 옵션은 모두 잘 작동한다고 생각합니다. 를 사용하면 tac --before
처음에는 약 5~1개의 빈 줄이 표시되지만 실제로는 그런 일이 발생하기로 되어 있습니다. 그렇죠?
답변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}'