일치하는 줄을 파일로 리디렉션하고 일치하지 않는 줄을 다른 파일로 리디렉션하려면 어떻게해야합니까?


13

최적화 된 방식으로 다음 요구 사항에 대해 이미 사용 가능한 스크립트 / 프로그램 / 유틸리티가 있습니까?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch

답변:


16

당신은 awk그것을 사용할 수 있습니다 .

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

1
나는 완전히 익숙 awk하지는 않지만 어느 시점에서 평가 >합니까? 조건부 적용 할 때마다 평가되는 경우 두 개의 한 줄 파일로
마무리됩니다

1
@Shadur >는 모든 출력을 파일로 인쇄하여 기존 파일을 덮어 씁니다. 동일한 인스턴스에서의 오래된 출력을 덮어 쓰는 새로운 라인을 생성하는 방식으로 평가되지 않습니다 awk. 즉, 일치하는 항목이 여러 개인 경우 "match"파일은 각 일치하는를로 구분합니다 OFS. 기존 파일의 처리 >와 차이점이 >>있습니다.
Chris Down

10

sed예를 들면 다음과 같습니다 .
참고 : sed의 w명령은 스크립트가 실행될 때마다 해당 특정 쓰기 명령이 트리거 된 경우에만 기존 파일을 덮어 씁니다. 따라서rm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file

좋은. 분기하지 않고 :sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti

6

awk에서 파일을 추가 할 수 있습니다.

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

또는 더 짧은 :

awk '{print >>(/pattern/?"matched":"unmatched")}'

그의 예제는 파일이 존재하는 경우 파일을 덮어 쓰지 않고 추가하려는 것이 아니라는 것을 보여줍니다.
Chris Down
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.