Redirect 重定向到管道中

Redirect 重定向到管道中,redirect,pipe,gawk,Redirect,Pipe,Gawk,在重定向到文件之前,是否有方法过滤stdout(或stderr)? “重定向到管道”可能不是最好的表达方式,但我正在寻找最简单的方法来实现这种效果 使用场景如下所示。我正在使用gawk--lint invalid原则上检测脚本中可能的错误,并希望过滤掉虚假的错误。我希望在写入文件之前进行过滤,而不是在检查文件时将错误重定向到文件并将其灰显 示例:此脚本每隔一行打印一次stderr echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid 'BEGIN {b =

在重定向到文件之前,是否有方法过滤stdout(或stderr)? “重定向到管道”可能不是最好的表达方式,但我正在寻找最简单的方法来实现这种效果

使用场景如下所示。我正在使用gawk--lint invalid原则上检测脚本中可能的错误,并希望过滤掉虚假的错误。我希望在写入文件之前进行过滤,而不是在检查文件时将错误重定向到文件并将其灰显

示例:此脚本每隔一行打印一次stderr

echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid 'BEGIN {b = 1;} // {if (b) print; else print > "/dev/stderr"; b = !b;}' 1>/dev/null 2>errors
cat errors | less

gawk: warning: regexp constant `//' looks like a C++ comment, but is not
b
d
gawk: (FILENAME=- FNR=4) warning: no explicit close of file `/dev/stderr' provided
但你可以看到虚假的“呆呆”警告(它们并不重要)。例如,可以使用

filter-gawk-output.sh
---------------------
grep -Ev 'looks like a|explicit close'
当重定向到错误文件时,是否有一种优雅的方法可以在线执行此操作? 现在检查错误文件时,我总是这样做

cat errors | ./filter-gawk-output.sh | less
那么:

gawk --lint=invalid 'whatever' INPUTFILE 2> GAWK_ERRORS.LOG 

这样,
STDERR
将被重定向到错误日志。

我不知道
gawk
具有更改警告输出的功能。所以我认为这更多的是关于shell语法的问题

给定

其中,
filter\u warnings
用于过滤掉
gawk
警告,并假设
bash
作为shell,我们可以使用
语法将
stderr
定向到管道命令:

echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid "$awkprog" |& filter_warnings
如果要将输出输出到文件,则需要使用括号:

(echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid "$awkprog" > output.1) |& filter_warnings > output.2

这里是
output.1
将包含
gawk
程序输出到
stdout
和输出。2到
stderr
的程序输出到
stderr

这里不可避免地出现了关于您对Cat的无用使用的评论(当然是一致的)。请看@tripleee:我可以说我使用cat使管道输入更加明显,并且不需要在脚本中添加额外的参数;更实际的是,当您尝试很多事情时,使用
cat
启动管道可以更容易地添加grep或sed等。在这两者之间,我怀疑
gawk
无法将诊断重定向到stderr以外的其他地方。如果是这样的话,那么问题实际上是关于您所选择的shell的一般语法(
bash
tcsh
zsh
或其他任何东西)。好吧,这就是它现在的工作方式,我想要的是不要将那些像我的帖子中提到的虚假的呆呆错误输出到gawk_errors.LOG。请记住,我的GAWK_ERRORS.LOG不仅包含GAWK错误,还包含我自己在脚本代码中插入的许多诊断(调用其他脚本等)。拥有一个复杂的脚本,最好只获得相关的错误消息。谢谢,谢谢,这似乎是对的。但是,假设我的gawk调用(您答案中的最后一行)在一个脚本中,而该脚本没有执行文件重定向,而外部世界是。因此,如果我使用&,错误与输出混合,并且两者都被过滤和输出。我需要的是保持标准输出不变,只过滤标准错误,脚本中的所有内容。然后,这个脚本将有正确的标准输出和过滤的标准错误,可以重定向到调用方想要的任何文件。这有意义吗?
(echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid "$awkprog" > output.1) |& filter_warnings > output.2