bash - 출력을 한 번에 한 줄씩 처리합니다.


0

xargs는 한 번에 한 줄씩 명령 출력을 처리하는 데 좋다고 읽었습니다. 스크립트에 다음 줄이 있습니다.

./gen-data | awk '{printf $2 " "; printf $1=$2=$3=""; gsub (" ", "", $0);if(length($0) == 0){ print "0000"} else{print $0}}' | xargs -t -n2 -P1 bash -c 'datatojson "$@"' _

그것은 올바른 결과를 산출합니다. 그러나 gen 데이터는 1000 줄과 같은 것을 만들어냅니다.이 명령은 1000 줄 이후가 아니라 각 줄마다 실행해야합니다. (더 많은 정보를 얻기 위해 정기적으로 멈추고 있습니다.)

gen-data는 다음과 같습니다.

candump $interface &
while true; do
    while read p; do
        cansend $interface $(echo $p | awk 'NF>1{print $NF}');
    done < <(shuf $indoc)
done

( cansend 데이터를 인터페이스로 보내고 candump 그 인터페이스에서 읽고 그것을 화면에 출력하지만, 나는 그다지 관련이 없다는 것을 내기한다). 어쨌든 candump 지속적으로 스트리밍 출력 인 것 같지만, awkxargs, 그것은 chunked된다. 내가 사용했기 때문일까? shuf? 나는 그것이 인터페이스를 통과하고 다른 편에서 읽혀지기 때문에, shuf가 제공하는 것보다 덜 청크 될 것이라고 생각할 것이다.


왜 당신이 사용하고 있습니까? shuf? 이 스크립트는 사용하지 않고 작동합니까? (나는 그것을 안다. 할까요 , 그러나 그것을 배제 할 필요가있다)
Felipe Lema

@FelipeLema 방금 시도해 보았습니다. cat 대신에 shuf 그리고 그것은 똑같은 일을합니다. 그 루프에 어떻게 먹일 수 있는지 잘 모르겠다. 스크립팅에 익숙하지 않다.
user3475234

답변:


2

이번에는 여러 개의 해킹을 사용하여 동일한 명령을 시도 할 수 있습니다. 완충을 피하십시오 :

./gen-data | gawk '{printf $2 " "; printf $1=$2=$3=""; gsub (" ", "", $0);if(length($0) == 0){ print "0000"} else{print $0}; fflush(stdout)}' | stdbuf -o0 xargs -t -n2 -P1 bash -c 'datatojson "$@"' _

변화에주의하십시오. awkgawk 및 사용 fflush. 시도해 볼 수도 있습니다. mawk -Winteractive. 또한 내가 추가 한 마음 stdbuf -o0 xargs 전에. 또한 처음부터 최신 버전을 사용해 볼 수도 있습니다. ./gen-data


완벽하게 일했습니다. 무엇이 -o0 ~하다 stdbuf 명령?
user3475234

에서 설명한 바와 같이 stdbuf man 페이지 : 명령의 버퍼링을 "unbuffered"로 설정합니다.
Felipe Lema
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.