【问题标题】:why cant I redirect the output from sed to a file为什么我不能将输出从 sed 重定向到文件
【发布时间】:2014-04-12 05:10:42
【问题描述】:

我正在尝试运行以下命令

./someprogram | tee /dev/tty | sed 's/^.\{2\}//' > output_file

但是当我去检查文件时,文件总是空白的。如果我从命令末尾删除> output_file,我可以毫无问题地看到 sed 的输出。

有什么方法可以将此命令中 sed 的输出重定向到文件?

【问题讨论】:

  • 由于某种原因,sed 是否可能打印到 stderr 而不是 stdout
  • someprogram 的输出是什么?
  • 它对我有用:sed 成功删除了前两个字符,结果以output_file 结束。
  • > outfile 替换为 | cat - -vet 。这将让您确认数据实际上来自sed 的std-out,它将显示^M,^I 之类的控制字符,并用$ 标记每行的结尾。如果您无法从该输出中得出为什么它不起作用的结论,那么我们可以在输出上使用更高级的工具,但使用它们变得更加难以解释。我的猜测是someprogram 是在行尾输出^M$
  • @shellter 你好,naab 建议为 sed 提供 -u 选项最终成功了。使用 cat - -vet,在每行的末尾放置一个“$”,尽管这是我得到的唯一额外输出

标签: bash debian


【解决方案1】:

使用-u 标志从sed 命令中删除输出缓冲,并确保您要记录的内容不在stderr 上

-u, --无缓冲

  load minimal amounts of data from the input files and flush the output buffers more often

最终命令:

./someprogram | tee /dev/tty | sed -u 's/^.\{2\}//' > output_file

流会发生这种情况(通常是程序在其整个生命周期内将输出发送到标准输出)。

sed / grep 和其他命令在这些情况下会进行一些缓冲,您必须明确禁用它才能在程序仍在运行时进行输出。

【讨论】:

    【解决方案2】:

    您遇到了标准错误和标准输出问题。在此主题上结帐In the shell, what does " 2>&1 " mean?。应该马上解决你。

    【讨论】:

      猜你喜欢
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多