tac 명령 옵션으로 인해 이상한 출력이 생성됨

tac 명령 옵션으로 인해 이상한 출력이 생성됨

내가 이 파일을 가지고 있다고 가정해 보세요.

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것을 정의합니다 .anewline이게 옳은 거니?

나는 훨씬 더 많은 입력을 가진 다른 문자열로 이것을 시도했지만 결국 꽤 혼란스러워졌습니다. 다른 옵션은 모두 제대로 작동합니다. 사용하면 tac --before먼저 빈 줄이 아닌 5개 정도를 얻지만 그 다음에는 무슨 일이 일어나야 하는지에 관한 것입니다. 그렇죠?

답변1

tac구분 기호가 레코드 종결자인 경우, 즉 구분 기호가 마지막 레코드 뒤에 나타나는 경우를 위해 주로 설계된 경우 이해하기가 더 쉽습니다. 레코드(각 종결자 포함)를 역순으로 인쇄합니다.

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

입력은 세 개의 레코드( foo, br)로 구성되며 각 레코드 뒤에는 구분 기호가 옵니다 a. 출력은 세 개의 레코드( r, bfoo)로 구성되며 각 레코드 뒤에는 구분 기호가 옵니다 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트위터와 같은 피드 애플리케이션에서 사용되는 것처럼 로그 파일 항목을 역순으로 표시하는 데 이 방법을 사용합니다 . 예를 들어 마지막 두 레코드만 역순으로 인쇄하려면 다음을 수행하세요.

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

관련 정보