Всегда можно сделать:
grep -o... | awk '{print};END{if (NR) print "\n" NR " matched."}'
Или сделать все это в awk
(, что также позволит избежать -o
и \+
GNUизмов):
awk 'match($0, /^[[:alpha:]_]+[[:blank:]]*\([[:blank:]]*\)/) {
print substr($0, RSTART, RLENGTH)
n++
}
END{if (n) print "\n" n " matched.")'
илиperl
:
perl -lne 'for (/^\w+\h*\(\h*\)/g) {print; $n++}
END {print "\n$n matched." if $n}'
(обратите внимание, что в этом случае \w
ограничен буквами ASCII, добавьте -Mopen=locale
, чтобы включить любую букву в любом алфавитном письме в соответствии с локалью, как в grep
илиawk
(некоторыеawk
)подходы)
Что касается вашего вопроса 2, это потому, что bash
(, в отличие от zsh
), не ожидает команд, запущенных в процессе подстановки, вызывая такого рода проблемы. См. Вывод замены процесса не соответствует порядку для получения более подробной информации.
Вы предоставили [[ args ]]
, которое являетсяусловным выражением , когда вы хотели выполнитьарифметическое вычисление , использующее синтаксис (( condition ))
.
Если вам нужно сравнить числа с плавающей запятой, проще всего обратиться к внешнему инструменту, такому как awk или bc
a=6.1
b=50
if [[ "$(echo "$a > $b" | bc)" -eq 1 ]]; then echo "a greater than b"; fi
Если вы сравниваете целые числа, используйте
if [[ 6 -gt 50 ]]; then echo "true"; fi
в противном случае, поскольку bash не может обрабатывать числа с плавающей запятой
if (( $(echo "6.5 > 50" | bc -l) )); then echo "true"; fi