shell-在agrep中显示最佳匹配的错误数

时间:2019-03-25 08:34:08

标签: linux bash shell grep agrep

我想做的是使用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 )?

1 个答案:

答案 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