0

我要做的是获取文件中最匹配的单词以及使用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 )?

4

1 回答 1

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
于 2019-03-25T13:10:28.540 回答