Я использую команду, отображающую результат в несколько строк. Я хотел бы увидеть результат, а затем отобразить количество строк результата.

Сегодня делаю:

my-command XXX    # to display the result  
echo "Number :" $(my-command XXX | wc -l)    # to display the number of lines

Но если я хочу изменить команду, мне придется изменить ее дважды. Есть ли лучший способ добиться того же результата?

1
Pozinux 6 Сен 2016 в 20:07

4 ответа

Лучший ответ

Вместо этого вы можете использовать awk:

awk '1; END{print NR}' <(command XXX)
  • 1 (действие awk по умолчанию) будет печатать каждую строку вывода команды.
  • END{print NR} напечатает # строк в выводе command в конце.
5
anubhava 6 Сен 2016 в 17:12
result=$(command)
echo "Number: $(echo "$result" | wc -l)"

Это помещает вывод команды в переменную, которую вы затем можете передать в wc.

2
Sebastian Lenartowicz 6 Сен 2016 в 17:11

Один простой, но ресурсоемкий вариант - просто сохранить вывод в массиве.

readarray -t result < <(command XXX)
printf '%s\n' "${result[@]}"
printf 'Number: %s\n' "${#result[@]}"

Вы также можете использовать tee, хотя здесь, вероятно, есть состояние гонки. Я бы не стал предполагать, что Number: NNN всегда выводится после вывода из tee.

command XXX | tee > >(printf 'Number: %d\n' $(wc -l))
1
chepner 6 Сен 2016 в 17:19
output="$(my-command args123)"
echo "$output"
echo "$(echo "$output" | wc -l)"
1
euphoria83 6 Сен 2016 в 22:47