同时使用 tee 和 grep (shell)?

同时使用 tee 和 grep (shell)?

我正在尝试运行一个写入 $log (txt 文件)的服务器,然后找到日志文件中以“[1]”开头的所有文本并将其放入另一个文件中。这是我的尝试。tee -a $log与其他一切一起工作。 grep 命令却没有。

run="tail -n0 -f -s 0.01 $cmds | (while true; do $tron --userconfigdir $userconfigdir --userdatadir $userdatadir --vardir $var; done) | tee -a $log | grep '^[1]' > ${var}logs/chatlogs.log"

怎样才能将从tee -a $log“[1]”开始的所有文本复制到另一个文件?

答案1

不要将命令放入字符串中。定义复合命令的方式是函数。

然后记住 shell 编程最重要的规则:始终在变量替换两边加上双引号,例如"$foo"

您有以下代码(依赖于变量cmdslogtronuserconfigdiruserdatadirvar

run () {
  tail -n0 -f -s 0.01 "$cmds" |
  while true; do
    "$tron" --userconfigdir "$userconfigdir" --userdatadir "$userdatadir" --vardir "$var"
  done |
  tee -a "$log" |
  grep '^[1]' > "${var}logs/chatlogs.log"
}

现在代码处于可读形式,您可以看到它$tron正在无限循环中执行。我不知道你到底想做什么,但你确实需要在该循环中添加终止条件。

答案2

[...]是字符列表的运算符。你可能想做grep '^\[1\]'

答案3

我认为如果你逃避方括号就足够了:grep '^\[1\]'

答案4

首先,使用 shell 调试选项set -vx来查看如何/何时评估变量等。

抱歉,但是为什么你的代码设置是这样的

 run="..."? 

因为稍后要使用该变量$run

如果是这样,那么你几乎肯定需要这样做

eval "$run"

就转义特殊字符而言,这开辟了一个全新的蠕虫罐头。正如另一位评论者指出的那样,您不仅需要转义所需的字符,还必须双重转义它们。当我过去让这样的事情发挥作用时,我最终可能会使用像\\\\\(5!) 这样的转义来让事情发挥作用。

如果没有进一步解释此代码的上下文,我的建议是忽略这些run=内容并按原样运行tail -n0 -f -s 0.01 $cmds |....

另外,根据吉尔斯的评论,并放大它,你的整个管道没有多大意义,

 tail -n0 -f -s 0.01 $cmds | (while true; do $tron ....

A.我们不知道里面有什么$cmds

B. 在子 shell 中我看不到任何(while true; ...)正在读取 tail cmd 输出的内容。如果你说它被完整地传递到了后面的teeafter end中while,那么我就学到了一些新东西。

C. 你真的想在无限循环中尽可能快地执行 $tron 命令吗?在许多系统上,这最终会消耗至少 1 个 CPU 的全部容量。也许添加一个sleep 1

添加更多有关您想要完成的任务的背景信息将有助于我们为您提供帮助!祝你好运。

相关内容