【问题标题】:Grep into variable and maintain stdout?进入变量并维护标准输出?
【发布时间】:2020-03-16 21:04:20
【问题描述】:

我有一个长时间运行的过程,我想从大量输出中捕获一小部分数据。

我可以通过 grep 管道来做到这一点,但我无法看到它喷出所有其他信息。

我基本上希望 grep 将它找到的内容保存到一个变量中,并且不理会 stdout。我该怎么做?

【问题讨论】:

  • 不可变,但您可以使用tee 将结果保存到文件并继续在终端上查看输出
  • 怎么样:command | tee >(grep whatever).
  • @tshiono echo foobar | tee >(\grep -o ob) 看起来很接近。我可以把它变成一个变量吗?
  • 您打算在哪里“查看”变量的内容?一旦您有一个进程占用了“滚动”一些日志信息的终端窗口,那么您可以在哪里查看同一屏幕上的变量?请充实您的预期用例,以便我们进行头脑风暴。 (将内容保存到单独的文件中可以让您从单独的窗口/终端查看简化的集合,如果我理解您的 Q 的话,您无法仅通过分配变量来完成此操作;-?)祝您好运。跨度>
  • 所以,从上面继续,command | tee >(grep whatever > specialOut) .... 然后你可以像var=$(< specialOut); echo "$var" 一样分配。祝你好运。

标签: linux bash grep


【解决方案1】:

使用teeprocess substitutionI/O redirection

{ var=$(cmd | tee >(grep regexp) >&3); } 3>&1

【讨论】:

  • { X=$(echo foobar | tee >(grep -Pom1 b..) >&3); } 3>&1; echo "$X" 太棒了!
【解决方案2】:

没有任何方法可以使用这样的变量。听起来您想编写自己的过滤器:

./some_long_program | tee >(my_do_stuff.sh)

那么,my_do_stuff.sh 就是:

#!/bin/bash
while read line; do
    echo "$line" | grep -q 'pattern' || continue
    VARIABLE=$line   # Now it's in a variable
done

如果你有存储空间,这可能更像你想要的:

./some_long_program | tee /tmp/slp.log

那么,简单地说:

grep 'pattern' /tmp/slp.log && VARIABLE=true

或:

VARIABLE=$(grep 'pattern' /tmp/slp.log)

这将让您随时运行 grep。我不认为这个变量真的增加了任何东西。

编辑

@mpen 根据您上面的最后一个答案,听起来您想使用xargs。试试:

(echo 1 ; sleep 5 ; echo 2) | xargs -L1 echo got:

-L1 将为找到的每个实例运行命令,否则它会获取大量标准输入并将它们全部(最多)一次传递给命令。如果您还想查看所有命令输出,您仍然需要通过tee 使用它:

./some_long_program | tee >(grep 'pattern' | xargs -L1 ./my_do_stuff.sh)

【讨论】:

    【解决方案3】:

    如果我们发球到/dev/tty,我认为这可以更简单一点:

    ❯ BAR=$(echo foobar | tee /dev/tty | grep -Pom1 b..); echo "[$BAR]"
    foobar
    [bar]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多