【问题标题】:SED does not print the last input [duplicate]SED 不打印最后一个输入[重复]
【发布时间】:2019-02-01 12:15:27
【问题描述】:

我正在尝试使用 tail 检查文件中的新行,然后使用 sed 在每个新行前面添加一些内容,并将输出打印到标准输出。

问题是,在文件中添加新行后,该行没有打印,而是前一行。

我是 Linux 菜鸟。到目前为止,我尝试将 sed 的输出通过管道传输到另一个程序,例如 echo、printf、cat、more、less,但这些都不起作用。

我还尝试在 sed 字符串的末尾添加“p”作为模式标志,但这会导致每个字符串打印两次。

tail -F /usr/local/logs/myfile.log | sed -e "s/^/[hostname:$HOSTNAME] 
[file:myfile.log] /" 

我打开另一个终端并输入:

echo "test1" >> /usr/local/logs/myfile.log

(什么也没发生,我希望打印带有“test1”的消息)

echo "test2" >> /usr/local/logs/myfile.log

(打印[hostname:5b1dc0d27a45] [file:myfile.log] test1,我期待“test2”)

如果我只使用 tail 而没有 sed,则每个新行都会正确显示 - 但当然不会添加我想要的内容。

【问题讨论】:

  • 在“打开另一个终端并输入:”时,您的具体操作是什么?我真正想问的是,你的tail | sed 命令、echo >> 命令和打印结果的时间线和位置是什么?
  • 它对我有用(当我在 sed 替换中使用 \n 而不是换行符时)。我只需要等一会儿。
  • @GenoChen 嗨,我要做的是:1)使用这个“tail -F ....”命令作为我的 docker 容器的命令 2)运行容器 3)打开另一个腻子会话运行 docker 的机器 4) 使用 docker exec 登录到正在运行的容器 5) 执行“echo >>”命令。此时我仍然可以在第一个窗口中看到容器的标准输出。
  • @choroba 你能分享 sed 字符串吗?我认为我发布的那个中没有任何换行符。
  • 我清楚地看到你的 sed 表达式有两行,所以必须有一个换行符。

标签: linux bash sed stdout tail


【解决方案1】:

您在跟随模式下使用尾巴。所以 sed 的输入没有关闭。为了优化,输出以块(缓冲)或末尾完成。 sed -u ... 应该有帮助:它将输出模式更改为无缓冲

【讨论】:

  • 成功了,谢谢!对我来说,问题是:我的 sed 没有可用的 -u 标志。有什么办法可以解决这个问题吗?我无法更新我使用的环境中的任何包。
  • 也许:awk '{ gsub(/.../,"..."); fflush()}' 而不是 sed
猜你喜欢
  • 2015-01-19
  • 2021-07-03
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2017-08-09
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多