我想做的是使用agrep
获取文件中最匹配的单词以及错误数量。现在,我只能使用以下脚本来了解这个词:
array=(bla1 bla2 bla3)
for eachWord in "${array[@]}"; do
result=$(yes "yes" | agrep -B ${eachWord} /home/victoria/file.txt)
printf "$result\n"
done
其中 bla {1,2,3} 是一些单词。
我的输出如下:
agrep: 4 words match within 2 errors; search for them? (y/n)counting
first
and
should
agrep: 1 word matches within 1 error; search for it? (y/n)should
agrep: 2 words match within 4 errors; search for them? (y/n)must
must
agrep: 1 word matches within 2 errors; search for it? (y/n)should
有什么办法可以使错误数量增加(在上面的输出示例中为 2,1、4、2 )?
答案 0 :(得分:0)
主要问题是,agrep
将错误报告为标准错误(文件描述符2),而不报告为标准错误(文件描述符1)。为了丢弃stdout并返回stderr,您必须将stdout重定向到/ dev / null并将stderr重定向到stdout:
2>&1 1>/dev/null
一个较小的问题是,如果您使用agrep
来填充yes
,则不会输出正确的行尾。您必须在stderr上写一个换行符:
echo >&2
最后,正如User123告诉您的那样,您需要一个sed
命令来提取错误数量。
这是一个示例:
for a in r1234t rot ruht rood; do
yes y | agrep -B "$a" /etc/passwd
echo >&2
done 2>&1 1>/dev/null |
sed -n 's/.* \([0-9]\+\) error.*/\1/p'
输出为:
4
1
2
1