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之后,此时无法将管道连接到它。因此,它只是在终端上运行,这是完全正确的——但也有可能通过管道进入配置为在运行时更改其行为的内容。我认为,“以其他方式保存它”的机制是问题的一个合理部分。在某些终端模拟器上,您可以随时启动跟踪。这是另一种方法,但它与会话本身无关。