bash 스크립트에서 tshark가 제공하는 grep url을 사용하는 방법은 무엇입니까?

bash 스크립트에서 tshark가 제공하는 grep url을 사용하는 방법은 무엇입니까?

tshark에서 while 루프로 연결된 URL을 사용하려고 합니다.

while read line ; do 
echo "$line"
ffmpeg -i "$line" -c copy "filename"
done < <(tshark -i tun0 -B 50 -P -V -q -l -Y 'http matches "(?<=\[Full request URI: )(http://mywebsite.com/file.*)(?=\])"' 2>&1 | grep --line-buffered -Po "(?<=\[Full request URI: )(http://mywebsite.com/file.*)(?=\])" | unbuffer -p uniq)

루프 내에서 $line을 다음과 같이 표시할 수 있습니다.

http://mywebsite.com/file?eid=5345944&fmt=5&app_id=214748364&range=20-30&etsp=1456777145&hmac=1K9nwkA8TOgtOXAsakSfMMVWsuE

그러나 어떤 이유로 ffmpeg를 공급하기 위해 동일한 while 루프 내에서 동일한 "line" 변수를 사용할 수 없습니다. 행위

ffmpeg -i "$line" -c copy "filename"

결과(모든 인용문을 정확하게 복사하여 붙여넣었습니다)

[http @ 0x1ab5ec0] HTTP error 400 Bad Request:
Server returned 400 Bad Request5345932&fmt=5&app_id=214748364&range=20-30&etsp=1456779359&hmac=35B2lA6D0zfR2DmfdPS4ZcilYxg

반면에 URL(에코의 출력)을 복사하고 큰따옴표로 묶은 다음 터미널에서 동일한 ffmpeg 명령을 사용하면 정상적으로 작동합니다.

또한 어떤 이유로 -xv를 사용하여 스크립트를 실행할 때 명령이 잘려서 전체 "+ ffmpeg -i 'http://...." 줄이 표시되지 않습니다.

답변1

편집: grep이 줄 바꿈이나 캐리지 리턴을 잡는 것 같습니다. 일회성 명령으로 제출할 때는 괜찮지만 루프에서는 제출할 수 없습니다. tr -d '\r' 추가

답변2

$lineGregg Leventhal이 지적했듯이 grep(또는 tshark?)은 캐리지 리턴을 변수로 캡처하는 것으로 나타났습니다 . 이 캐리지 리턴을 제거해야 합니다.

$line루프 내부를 교체하는 것이 $(echo "$line" | tr -d '\r')저에게 효과적이었습니다!

관련 정보