일부 값/숫자를 출력하는 스크립트가 있는데 이를 두 개의 파일로 분할하고 싶습니다. 나는 다음과 같은 것을보고 있습니다 :
./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 및 파생 제품에서는 pee
package.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