프로그램 출력에서 ​​여러 패턴을 평가하고 패턴별 파일 작성

프로그램 출력에서 ​​여러 패턴을 평가하고 패턴별 파일 작성

일부 값/숫자를 출력하는 스크립트가 있는데 이를 두 개의 파일로 분할하고 싶습니다. 나는 다음과 같은 것을보고 있습니다 :

./runme.sh | grep 'ook' >> ook.out | grep 'eek' >> eek.out

이 경우 두 번째 파이프라인은 첫 번째 grep의 출력이 아니라 runme.sh의 출력을 가져와야 합니다. 그게 가능합니까?

답변1

이것이 이 유틸리티의 완벽한 사용 사례입니다 pee.

./runme.sh | pee "grep ook >> ook.out" "grep eek >> eek.out"

Debian 및 파생 제품에서는 peepackage.json 에서 찾을 수 있습니다 moreutils.

답변2

그런 다음 두 모드 모두에서 egrep을 수행해야 합니다.

`/.runme.sh | egrep "확인|eek"

하지만 각 패턴 평가 출력을 grep이 지원하지 않는 자체 파일로 리디렉션해야 하는 것 같습니다. 누구든지 가능하다면 수정해주세요.

편집: minaev는 moreutils에서 오줌의 실제 예제를 제공했지만 플랫폼에 오줌이 없는 경우에도 이와 같이 tee를 사용할 수 있습니다. 프로세스 대체를 가지고 놀아보세요.

./runme.sh |tee >(grep ook > ook.txt) >(grep eek > eek.txt)

예:

[centos@centos scripts]$ ./runme.sh
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ ./runme.sh | tee >(grep eek >eek.txt) >(grep ook >ook.txt)
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ cat eek.txt 
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
[centos@centos scripts]$ cat ook.txt 
keekookjsfskooeek
ook
[centos@centos scripts]$ 

답변3

간단한 awk대안:

./runme.sh | awk '/ook/{print>>"ook.out"}/eek/{print>>"eek.out"}'

몇 가지만 추가하면 코드를 쉽게 확장할 수 있습니다 awk. 필요한 정규식 출력 파일 쌍만큼 r 배열에 넣기만 하면 됩니다.

./runme.sh | awk 'BEGIN{r["ook"]="ook.out";r["eek"]="eek.out"}{for(i in r)if($0~i)print>>r[i]}'

sed w명령은 와 동일하지만 >안타깝게도 파일에 추가할 수 없습니다.

./runme.sh | sed -n $'/ook/wook.out\n/eek/week.out'

답변4

주문하다파이프라인 스트림의 복사본을 임시 파일에 보관할 수 있습니다. 그런 다음 원시 stdout 파일과 임시 파일을 별도로 grep할 수 있습니다.

./runme.sh |tee temp |grep ook >>ook.out;grep eek temp >>eek.out

관련 정보