grep
не работает таким образом.Используются диапазоны символов, а не диапазоны номеров.
Например, [a-c]
соответствует a
или b
или c
.Когда не используется -
, совпадает любой из символов [abc]
также соответствует a
или b
или c
.
Для этого [0-1]
соответствует 0
или 1
.
А [500-1000]
соответствует 5
или 0
или 0
или 1
или 0
или 0
или 0
.Это то же самое, что и [015]
Наконец, в любом месте искомых строк найдено совпадение, поэтому, например, [015]M
также соответствует строке с 7777775M
.
Решение для совпадения500 - 999 будет:
^[5-9]\?[0-9]\?[0-9](\.[0-9]*)\?M
Чтобы соответствовать 500 - 1000, будет немного сложнее:
^\([5-9]\|10\)\?[0-9]\?[0-9](\.[0-9]*)\?M
Я предлагаю не использовать регулярные выражения для разбора диапазона чисел.
Вы можете использовать awk
или даже цикл оболочки, если вы хотите продолжать использовать некоторый grep.awk намного быстрее, цикл оболочки будет выглядеть примерно так:
du -h --max-depth=1 /u01/app/oowner/diag/rdbms | grep '^[0-9\.]*M' | while read -r line; do
num=$(echo "$line" | grep -o '^[0-9]*')
if test "$num" -ge 500; then
echo "$line"
fi
done | sort -rh
awk
упоминается в комментарии @ PackardCPW к вопросу