a.out
표준 출력으로 많은 수의 메시지를 생성하는 프로그램을 생각해 보겠습니다. 예를 들면 다음과 같습니다 .
$ ./a.out
A: abc
B: xyz
A: aaa
A: bbb
B: zzz
C: fff
...
내가 필요한 것은 출력을 별도의 파일로 구별하는 것입니다. 하나는 A:
접두사가 있는 줄을 포함해야 하고 두 번째는 B:
등을 포함해야 하며 표준 출력과 어떤 패턴도 일치하지 않는 줄을 남겨 두어야 합니다.
물론 의 전체 출력을 리디렉션 a.out
한 다음 grep
ping할 수 있습니다. 그러나 출력 파일이 많은 디스크 공간을 사용하는 경우 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)