mycommand.sh를 한 번만 실행하여 필터링된 출력을 여러 파일로 리디렉션할 수 있습니까?
샘플 출력은 다음과 유사해야 합니다.
mycommand.sh | grep --line-buffered -B 1 A >> file1 ; my command.sh | grep --line-buffered -A 1 B >> file2
아니면 어떻게 든 egrep을 사용할 수도 있습니다 ...
답변1
그리고awk
주문하다:
mycommand.sh | awk '/A/{ print > "file1" }/B/{ print > "file2" }'
/A/{ print > "file1" }
- 기록이 패턴과 일치하면A
전체 기록을 다음으로 인쇄/리디렉션합니다.file1
답변2
awk
grep
더 빠르고, 분기 나 여러 번이 필요하지 않으며, 원하는 수의 파일 쓰기에 맞게 쉽게 확장할 수 있기 때문에 더 나은 도구입니다 . .NET과 perl
같은 대부분의 다른 스크립팅 언어에서도 마찬가지입니다 python
.
쉘에서 다음을 사용할 수 있습니다 tee
.프로세스 교체. 예를 들어
mycommand.sh |
tee >(grep --line-buffered -A 1 B >> file2) |
grep --line-buffered -B 1 A >> file1
(가독성을 위해 추가 줄바꿈과 들여쓰기를 추가하세요. 보기 흉하고 읽기 어려운 콘텐츠를 좋아한다면 모든 것이 한 줄에서 작동합니다)
tee
입력 내용을 다음과 같이 씁니다.둘 다stdout(예: 터미널로, 파일로 리디렉션되거나 파이프의 다음 명령으로 파이프됨)그리고명령줄에 지정된 파일로 이동합니다.
이 경우 "파일"은 프로세스 대체( grep
예: 위의 예에서와 같이 리디렉션된 출력이 있는 다른 명령)에 의해 제공되는 파일 설명자입니다.
tee
여러 출력 파일(또는 프로세스 대체 파일 설명자)을 동시에 쓸 수 있습니다. 예를 들어:
mycommand.sh |
tee >(grep --line-buffered -A 1 B >> file2) \
>(grep --line-buffered -A 1 C >> file3) \
>(grep --line-buffered -A 1 D >> file4) |
grep --line-buffered -B 1 A >> file1
이것은 작동하지만 개인적으로 @RomanPerekhrest의 awk
답변을 사용합니다.