3

通常,当一个人想要查看运行某事的特定输出行时,可以执行以下操作:

./a.out | grep IHaveThisString

但是如果 IHaveThisString 是每次都会改变的东西,所以你需要先运行它,观察输出以捕捉特定运行中的 IHaveThisString 是什么,然后 grep 出来呢?我可以只转储到文件,然后再转储 grep,但是否有可能做一些类似背景的事情,然后把它带到前台,然后把它带回来,但现在通过管道输送到一些 grep?类似于:

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

就是想..

4

4 回答 4

2

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

于 2012-07-11T21:01:18.037 回答
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 时使用它来完成。

于 2012-07-11T21:12:12.060 回答
1

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

  • 你必须先进入script会话;
  • 那么你通常如何使用shell;
  • 然后你开始并中断你的程序;
  • 然后运行grep文件typescript

例子:

$ script
$ ./a.out
Ctrl-Z
$ fg 
$ grep NowIKnowThisString typescript
于 2012-07-11T21:08:45.997 回答
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它本身可以将文件作为参数,但你不使用文本文件,所以这就是你使用它的方式。

当然,您需要根据您的情况修改命令。

于 2012-07-11T21:16:14.637 回答