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


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.