如何在 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)

在循环内部,我可以很好地 echo $line ;它看起来像这样:

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

但由于某种原因,我无法在同一个 while 循环内使用同一个“line”变量来提供 ffmpeg。正在做

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(从 echo 输出),双引号它并在终端中使用相同的 ffmpeg 命令效果很好。

此外,由于某种原因,使用 -xv 运行脚本时该命令会被截断,因此它不会显示完整的“+ ffmpeg -i 'http://....”行。

答案1

编辑:看起来 grep 正在捕获换行符或回车符,当您将其作为一次性命令提交时,这很好,但在循环中则不好。添加 tr -d '\r'

答案2

事实证明,grep(或 tshark?)正在将回车符捕获到$line变量中,正如 Gregg Leventhal 所指出的那样。这个回车需要去掉。

$line将循环内部替换为$(echo "$line" | tr -d '\r')对我来说是成功的!

相关内容