1

有没有办法在重定向到文件之前过滤标准输出(或标准错误)?“重定向到管道”可能不是最好的表达方式,但我正在寻找实现这种效果的最简单方法。

使用场景如下。我原则上使用 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

但是你可以看到虚假的 gawk 警告(它们并不重要)。例如,它们可以被过滤,使用

filter-gawk-output.sh
---------------------
grep -Ev 'looks like a|explicit close'

重定向到错误文件时,是否有一种优雅的方式来内联?现在在检查错误文件时,我总是这样做

cat errors | ./filter-gawk-output.sh | less
4

2 回答 2

0

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

给定

filter_warnings() { grep -v '^gawk:'; }
awkprog='BEGIN {b = 1;} // {if (b) print; else print > "/dev/stderr"; b = !b;}'

wherefilter_warnings用于过滤掉gawk警告并假设bash您的外壳,我们可以使用语法直接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

于 2012-12-24T11:09:15.680 回答
0

关于什么:

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

这种方式STDERR将被重定向到错误日志。

于 2012-04-10T12:21:03.677 回答