重定向到管道

时间:2012-04-10 09:24:20

标签: redirect pipe gawk

有没有办法在重定向到文件之前过滤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

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

过滤它们
filter-gawk-output.sh
---------------------
grep -Ev 'looks like a|explicit close'

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

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

2 个答案:

答案 0 :(得分:0)

怎么样:

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

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

答案 1 :(得分:0)

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

鉴于

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

其中filter_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