Вы должны сделать это самостоятельно: эта команда sed экранировала любые не буквенно-цифровые символы, что и делает quotemeta
(IIRC)
str="abc.def.ghi"
escaped=$(sed 's/[^[:alnum:]]/\\&/g' <<< "$str")
echo "$escaped" # => abc\.def\.ghi
мы ожидаем совпадения, потому что исходная строка используется как регулярное выражение
$ echo "foo bar abc-def-ghi baz" | grep "$ str"
foo bar abc-def-ghi baz
мы ожидаем, что это не будет соответствовать, потому что оно использует экранированную строку.
$ echo "foo bar abc-def-ghi baz" | grep "$ escaped"
$ echo $?
1
мы ожидаем совпадения, потому что он использует экранированную строку.
$ echo "foo bar abc.def.ghi baz" | grep "$ escaped"
foo bar abc.def.ghi baz
Причина, по которой вы не получаете выходные данные, заключается в том, что wc -l
потребляет все выходные данные. Вы можете использовать tee
в сочетании с подстановкой процесса, чтобы получить awk
для вывода на консоль, а также прочитатьwc
:
inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | tee >(wc -l)
Это все еще немного проблематично, так как inotifywait
— это команда, которая никогда не завершается, но wc -l
не печатает вывод, пока не прочитает все данные, в данном случае, когда канал закрывается. Вы можете сделать свой подсчет прямо вawk
:
inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk 'BEGIN { total=0 } { print; total++; print total } END { print "final total: " total }'