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