Linux Grep是否在进程启动后过滤该进程的输出?

Linux Grep是否在进程启动后过滤该进程的输出?,linux,bash,grep,pipe,Linux,Bash,Grep,Pipe,通常,当您想查看运行某项操作的特定输出行时,可以执行以下操作: ./a.out | grep IHaveThisString 但是,如果IHaveThisString每次都会更改,因此您需要首先运行它,观察输出以捕获特定运行中IHaveThisString的内容,然后将其重新显示,该怎么办?我可以直接转储到文件中,然后再转储到grep中,但是否可以做一些类似于背景的事情,然后将其放到前台,然后再将其带回,但现在可以通过管道传输到某个grep中?类似于: ./a.out Ctrl-Z fg |

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

./a.out | grep IHaveThisString
但是,如果IHaveThisString每次都会更改,因此您需要首先运行它,观察输出以捕获特定运行中IHaveThisString的内容,然后将其重新显示,该怎么办?我可以直接转储到文件中,然后再转储到grep中,但是否可以做一些类似于背景的事情,然后将其放到前台,然后再将其带回,但现在可以通过管道传输到某个grep中?类似于:

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

只是想知道..

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

您需要的东西有点奇怪,但您可以这样做:

  • 您必须先进入
    script
    会话
  • 那么你通常是如何使用shell的
  • 然后启动并中断程序
  • 然后在
    typescript
    文件上运行
    grep
例如:

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

简言之:你可以这样做,但你需要知道你需要提前做;这不是事后可以交互实施的东西


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

run_my_command | { read string_to_filter_for; fgrep -e "$string_to_filter_for" }
用尽可能多的命令替换的
读取字符串\u到\u过滤器\u,以读取足够的输入,以确定目标字符串是什么;如果需要,这可以是一个循环

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

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时使用该检查来完成。

您可以使用流编辑器,例如
sed
,而不是
grep
。这里有一个例子来说明我的意思:

$cat列表
要查找的名称:迈克
多拉1号
约翰2
迈克3
海伦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
本身可以将文件作为参数,但您不使用文本文件,所以您可以这样使用它


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

您是否尝试过使用
/a.out>一些_文件
,然后再执行
tail-f一些_文件
?据我所知,目标是使grep成为管道的一部分——因此,随着新输出的生成,而不是仅在输出完成后才覆盖静态文件。在已经存在的内容用尽后,此处提供的内容将不会继续通过grep发送新内容。@CharlesDuffy:不,Charles,你错了。您在前台运行流程,这意味着您在流程完成后启动
grep
。唯一的一点(据我所知)是,您希望在没有
grep
的情况下启动流程,并且当您在输出中看到一些有趣的内容时,您希望
grep
它。我不同意这种解释。声明的目标是能够“使流程回到前台”,其输出现在已被过滤。如果它是在前台,显然它仍打算在此时运行并生成新的输出。这使得我们试图完成的任务变得困难——但并非不可能。fg之后,此时无法将管道连接到它。因此,它只是在终端上运行,这是完全正确的——但也有可能通过管道进入配置为在运行时更改其行为的内容。我认为,“以其他方式保存它”的机制是问题的一个合理部分。在某些终端模拟器上,您可以随时启动跟踪。这是另一种方法,但它与会话本身无关。