
매우 복잡한 명령 세트가 있습니다.
command | ... | ... | tee >(grep -c '[^3]$') >(grep -c '[^35]$') 1>/dev/null
출력이 매우 크기 때문에 출력을 저장하기 위한 임시 파일을 갖고 싶지 않습니다. 나는 >(grep -c '[^3]$' | read variable)
이것을 시도했지만 >(grep -c '[^3]$' | read variable2)
프로세스 대체 때문에 서브쉘 비트가 작동하지 않는 것 같습니다.
출력을 여러 변수에 직접 파이프하려면 어떻게 해야 합니까? 가능합니까?
이제 다음 해결 방법이 있습니다.
var=$(command ... | ... | ... | tee >(grep -c '[^3]$') >(grep -c '[^35]$') 1>/dev/null)
var1=$(tail -1 <<< $var)
var2=$(head -1 <<< $var)
하지만 제 생각에는 투박하고 보기에 좋지 않은 것 같아요. 나는 다른 파일을 grep할 수 있다는 것을 알고 있지만 그것도 마음에 들지 않습니다.
미리 감사드립니다.
답변1
두 grep 프로세스를 모두 바꾸려면 -ing awk
대신 를 사용하십시오 . tee
예를 들어:
command | ... | ... | awk '
/[^3]$/ { c1++; next };
/[^35]$/ { c2++; next };
END { print c1, c2 > counts.txt }'
read var1 var2 < counts.txt
rm counts.txt
임시 파일을 사용하지 않으려면 다음과 같이 하세요.
read var1 var2 < <(command | ... | ... | awk '
/[^3]$/ { c1++; next };
/[^35]$/ { c2++; next };
END { print c1, c2 }')
답변2
첫째, 명령 체인에서 stdout을 전송하므로 /dev/null
할당에 null 값이 할당될 수 있습니다. 삭제하세요. 출력의 첫 번째 줄과 마지막 줄만 캡처하려고 하는 것 같습니다. 한 줄로 처리하는 것은 까다로울 수 있지만 awk
다음과 같이 처리할 수 있습니다.
var="$(command ... | [...] | tee [...] | awk 'NR==1{print $0} END { print $0}')"
그러나 파이프는 단순한 생물입니다. 입력과 출력이 있습니다. 파이프를 (쉽게) 사용하여 여러 위치로 데이터를 보낼 수는 없습니다. 당신이 얻을 수있는 가장 가까운 것은 사용하는 것입니다명명 된파이프는 본질적으로 피하려고 하는 임시 파일입니다(기술적으로 올바르지 않습니다. FIFO 대기열은 파일과 동일하지 않지만 단순화하고 있습니다).