출력 일치 패턴의 일부를 파일로 파이프하고 나머지는 표준 출력으로 남겨두려면 어떻게 해야 합니까?

출력 일치 패턴의 일부를 파일로 파이프하고 나머지는 표준 출력으로 남겨두려면 어떻게 해야 합니까?

a.out표준 출력으로 많은 수의 메시지를 생성하는 프로그램을 생각해 보겠습니다. 예를 들면 다음과 같습니다 .

$ ./a.out

A: abc
B: xyz
A: aaa
A: bbb
B: zzz
C: fff
...

내가 필요한 것은 출력을 별도의 파일로 구별하는 것입니다. 하나는 A:접두사가 있는 줄을 포함해야 하고 두 번째는 B:등을 포함해야 하며 표준 출력과 어떤 패턴도 일치하지 않는 줄을 남겨 두어야 합니다.

물론 의 전체 출력을 리디렉션 a.out한 다음 grepping할 수 있습니다. 그러나 출력 파일이 많은 디스크 공간을 사용하는 경우 grep결과를 저장할 공간이 충분하지 않을 수 있습니다.

partial-redirect이 상황에서 사용할 수 있는 다음과 같은 몇 가지 명령을 사용하는 것이 더 좋습니다 .

./a.out | partial-redirect ^A: a.txt | partial-redirect ^B: b.txt | partial-redirect ^C: c.txt > rest.txt

그러한 명령이 존재하고 일반적입니까, 아니면 이 작업을 해결하기 위해 직접 구현해야 합니까?

답변1

awk -F':' '$1 ~ "[AB]" { print > $1 } $1 !~ "[AB]" { print > "otheroutput" } ' input

또는 일반적인 경우 전체 입력은 첫 번째 필드를 기준으로 분할됩니다.

awk -F':' '{ print > $1 }' input

사용 중:

$ cat input
A: abc
B: xyz
A: aaa
A: bbb
B: zzz
C: fff
$ awk -F':' '$1 ~ "[AB]" { print > $1.txt } $1 !~ "[AB]" { print > "otheroutput" } ' input
$ cat A
A: abc
A: aaa
A: bbb
$ cat B
B: xyz
B: zzz
$ cat otheroutput
C: fff

답변2

이것은 tee다음을 위한 것 입니다 bash:

./a.out | tee >(grep A >fileA) | tee >(grep B >fileB) | grep C >fileC

훨씬 더 간단합니다 zsh.

./a.out > >(grep A >fileA) > >(grep B >fileB) > >(grep C >fileC)

관련 정보