还有另一个问题几乎相同,但其答案中的任何建议都不适用于我: 将 tail -f 导入到 awk 中
我正在尝试 tail -fa logfile 但想在显示它之前用 \n 替换 \r,这样终端就不会覆盖自身,而是允许我滚动浏览输出。
这正如猜测的那样有效:
tail -f -c 1000 "mycustom.log"
还有这个:
tail -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'
然而,这三个都没有打印任何东西到我的控制台:
tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'
stdbuf -o0 tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'
unbuffer tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'
为了unbuffer
让我的系统知道,我必须安装这个包expect-dev
使用awk
或mawk
似乎没有什么区别。我还写了一个sed
变体:
sed 's/\r/\n/g'
对我来说其表现是一样的。
我还发现了这个问题:
https://stackoverflow.com/questions/15325548/how-to-use-tail-in-combination-with-sed
但是 sed -u 参数对我来说没有任何改变,并且 $'..' 构造被我认为是语法错误sed
- 将其更改为 \$'...' 确实可以运行,但是使用 tail -f 管道对其进行管理并不会像我尝试过的其他所有操作一样打印任何内容。
我还有什么可以尝试的吗?问题出在我在 sed / awk 中使用全局命令吗?或者问题出在原始流tail -f
只有“一行”,因为其中没有 \n?有没有办法让 sed 或 awk 处理比逐行更小的块?
有没有其他方法可以用 \n 替换所有 \r tail -f
?
答案1
好的,我找到了答案:由于我的日志文件对于 awk 和 sed 来说看起来像一行永远无法完成的命令(如果使用 tail -f 的话),因此它们永远不会输出任何内容。因此我写了这个解决方法:
tail -c 1 -f "$path" | while read -r -n1 char
do
if [ "$char" = $'\r' ] ; then
echo ""
else
echo -n "$char"
fi
done
虽然很丑,但是可以工作;)
更新:用户 G-Man 提出了一种更好、更有效的方法:
tail -c 1 -f "$path" | tr "\r" "\n"