Grep过滤后的进程输出?

时间:2012-07-11 20:28:48

标签: linux bash grep pipe

通常,当想要查看运行某些特定输出行时,可以执行以下操作:

./a.out | grep IHaveThisString

但是如果IHaveThisString是每次都要更改的东西,所以你需要先运行它,看看输出以捕获特定运行中的IHaveThisString,然后grep出来怎么办?我可以转储到文件,然后grep但是有可能做一些像背景它然后把它带到前台然后把它带回来但是现在用管道输入grep?类似于:

./a.out
Ctrl-Z
fg | grep NowIKnowThisString

只是想知道..

4 个答案:

答案 0 :(得分:2)

不,如果您没有以其他方式保存它,它只在您的屏幕缓冲区中。

答案 1 :(得分:1)

你需要什么有点奇怪,但你可以这样做:

  • 您必须先进入script会话;
  • 然后你通常使用shell;
  • 然后你开始并打断你的程序;
  • 然后在grep文件上运行typescript

示例:

$ script
$ ./a.out
Ctrl-Z
$ fg 
$ grep NowIKnowThisString typescript

答案 2 :(得分:1)

简短形式:您可以这样做,但您需要知道您需要提前完成;这不是可以事后以交互方式实施的东西。


编写脚本以确定字符串是什么。我们需要一个更详细的输出格式示例来提供更好的使用示例,但这里有一个简单的情况,其中整个第一行是过滤器目标:

run_my_command | { read string_to_filter_for; fgrep -e "$string_to_filter_for" }

使用尽可能多的命令替换read string_to_filter_for以读取足够的输入以确定目标字符串是什么;如果有必要,这可能是一个循环。

例如,假设输出包含以下内容:

Session id: foobar

此后,您想要grep包含foobar

的行

...然后你可以通过以下脚本:

re='Session id: (.*)'
while read; do
  if [[ $REPLY =~ $re ]] ; then
    target=${BASH_REMATCH[1]}
    break
  else
    # if you want to print the preamble; leave this out otherwise
    printf '%s\n' "$REPLY" 
  fi
done
[[ $target ]] && grep -F -e "$target"

如果要手动指定过滤器目标,可以通过循环检查使用过滤器内容创建的文件,然后在启动grep后使用 来完成此操作。

答案 3 :(得分:1)

您可以使用sed等流编辑器代替grep。这是我的意思的一个例子:

$ cat list 
Name to look for: Mike

Dora 1
John 2
Mike 3
Helen 4

在这里,我们找到要在第一行中查找的名称,并希望grep为它。现在将命令传递给sed

$ cat list | sed -ne '1{s/Name to look for: //;h}' \
> -e ':r;n;G;/^.*\(.\+\).*\n\1$/P;s/\n.*//;br'
Mike 3

注意:sed本身可以将文件作为参数,但您不使用文本文件,这就是您使用它的方式。

当然,你需要为你的案例修改命令。