명령을 한 번 실행하고 여러 파일의 출력을 필터링합니다.

명령을 한 번 실행하고 여러 파일의 출력을 필터링합니다.

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

awkgrep더 빠르고, 분기 나 여러 번이 필요하지 않으며, 원하는 수의 파일 쓰기에 맞게 쉽게 확장할 수 있기 때문에 더 나은 도구입니다 . .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답변을 사용합니다.

관련 정보