Unix:如何修改和重定向所有正在运行的进程的stdout

时间:2016-04-27 13:15:59

标签: linux unix redirect awk

我想修改并重定向所有正在运行的进程的输出。我知道,如果我知道过程的名称,我可以做这样的事情

process 2>&1 >/dev/null 

将stderr和stdout重定向到dev / null。首先,如何在将stdout发送到dev / null或其他任何地方之前修改它?一种可能的解决方案是

process 2>&1 | awk '{print "$SOME_ENV_VAR|" $0;}' > dev/null

这是正确的方法吗?是否能够重定向stdout和stderr?

  1. 如果不是重定向到dev / null,我想打印到控制台怎么办?

  2. 更大的问题是,如何为每个正在运行的进程执行此操作?我需要在linux框中执行此操作,我不知道正在运行的进程的名称。这可行吗?

  3. 我是shell脚本的新手,所以请原谅我这些问题是微不足道的。

1 个答案:

答案 0 :(得分:1)

从讨论中可以看出你并不是真的想要的 将已经运行的进程的输出重定向到其他位置。但您似乎正在尝试修改正在开始的流程的输出。

使用bash(似乎是您正在使用的),您可以使用[FD]>TARGET resp。 [FD]<SOURCE用于指定进程的I / O通道。 FD是可选的,是文件描述符号。将其遗漏意味着0上的<(= stdin)和1上的>(= stdout)。 (2是stderr的着名文件描述符)。 TARGETSOURCE我是文件系统对象(例如文件,设备,命名管道,unix域套接字)或&FD其中FD再次是文件描述符编号并指示(打开)filedescriptor使用。

您将使用它,例如通过写入:2>&1将错误输出发送到stdout所在的位置。

如果您现在想要对进程的输出进行后处理(实际上这是shell术语中的管道,因为它可能是由几个命令和I / O重定向组成的任何复杂(shell)语句。)  你将使用管道:(A | B)。
这基本上将进程A的stdout与进程B的stdin连接起来。

对于操作输出,您可以使用任何其他unix命令或程序。最常见的是sed(用于应用基于正则表达式的替换)或awk。其他人也可能会推荐perlpython

在您的情况下,您打算在每个行前面加上一些环境变量给出的前缀。

使用awk,您可以按如下方式编写:

awk '{ print "'"$SOME_ENV_VAR"'|" $0;}'

或将外部值作为awk变量传递:

awk -v var="$SOME_ENV_VAR" '{ print var "|" $0;}'

更进一步:

使用bash输出重定向非常强大。例如,你可以将stdout传递给一个管道并将sterr传递给另一个管道。例如:

(((echo hallo; echo ERROR >&2) | awk '{ print "stdout|" $0; }' >&4) 2>&1|  awk '{ print "stderr: " $0;}' ) 4>&1   

这将通过单独的awk实例处理stdout和sterr,并将(组合)输出发送到shell的正常stdout。