shell - отображать количество ошибок для лучших совпадений в agrep - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь получить наиболее подходящее слово в файле и количество ошибок для него, используя 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 голосов
/ 25 марта 2019

Основная проблема состоит в том, что agrep сообщает об ошибках к стандартной ошибке (дескриптор файла 2), а не к стандартной ошибке (дескриптор файла 1). Чтобы выбросить стандартный вывод и вернуть stderr, вы должны перенаправить стандартный вывод в / dev / null и перенаправить стандартный вывод в стандартный вывод:

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
...