Вопрос или проблема
На моем lubuntu 24.04 у меня маленькая файловая система /, поэтому я время от времени проверяю, достаточно ли свободного места.
Для этого я использую
sudo du -xh -d 3 / | sort -h -r | egrep -v '*M|*K'
grep: предупреждение: * в начале выражения
grep: предупреждение: * в начале выражения
27G /
12G /var
10G /var/cache
9,8G /var/cache/apt
9,6G /usr
6,0G /usr/lib
5,6G /boot
2,8G /boot/ubuntu-20.10
2,5G /boot/bullseye
2,2G /usr/share
1,9G /usr/lib/x86_64-linux-gnu
1,7G /var/lib
Это не вопрос о том, куда делось мое место, я просто не могу понять, что означает предупреждение и как его избежать.
env | grep -i shell
SHELL=/bin/bash
egrep
ожидает регулярное выражение, но вы задали *M|*K
. Есть звездочка в начале обоих альтернативных выражений. Звездочка имеет специальное значение в регулярных выражениях: она указывает, что “предыдущий элемент повторяется ноль или более раз”. Но здесь нет предыдущего элемента для повторения. Отсюда и предупреждение.
Возможно, вы пытаетесь использовать шаблон поиска в синтаксисе глоббинга, используя *
как символ подстановки? grep
так не работает. С grep
вы используете регулярные выражения. re
в grep
на самом деле обозначает “регулярное выражение”.
В регулярных выражениях *
является квантификатором. Квантификатор указывает, как часто должно быть распознано предыдущее элемент. Например, чтобы распознать “как минимум одну ‘a’, после которой идет ровно одна ‘b'”, вы могли бы использовать шаблон a+b
.
В вашем шаблоне квантификатор *
находится в самом начале, поэтому нет предыдущего элемента, для которого можно указать количество. Вы, по сути, говорите: “ищите ноль или более экземпляров, а затем ровно одну ‘M'”. Это не совсем работает 😉 *
в самом начале регулярного выражения фактически предполагается, что это вызовет неопределенный результат по стандарту POSIX.
К счастью, вам не нужно задавать все вхождения в вашем шаблоне поиска. Так что вы можете просто искать “ровно один M или ровно один K, за которым следует пробельный символ” вот так
egrep "[MK]\s"
Если этот точный шаблон вдруг появится в ваших путях к файлам, эти совпадения также будут найдены. Вы могли бы усложнить регулярное выражение, чтобы исключить эти ложные срабатывания, но это выходит за рамки этого ответа.
Ответ или решение
Когда речь идет о работе с файловыми системами и управлении дисковым пространством, важно использовать корректные инструменты и команды для анализа и обработки данных. Вы столкнулись с предупреждением при использовании команды egrep
, и ниже я постараюсь максимально подробно объяснить, с чем это связано и как можно исправить ситуацию.
Теория
Команда egrep
является расширением grep
, предназначенной для работы с расширенными регулярными выражениями. Регулярные выражения (regex) — это мощный инструмент для поиска и обработки текстовых данных, который широко используется в различных системных утилитах для фильтрации и поиска информации.
Основной причиной предупреждения, которое вы видите, является некорректное использование метасимвола *
в вашем регулярном выражении. В регулярных выражениях *
является квантификатором, который указывает на то, что предшествующий элемент должен повторяться «ноль или более раз». Если перед *
отсутствует элемент, которому он может быть применен, это приводит к синтаксической ошибке или предупреждению.
Ваше выражение *M|*K
начинается с *
, что не имеет смысла с точки зрения синтаксиса регулярных выражений, так как нет предшествующего элемента для применения квантификатора. При попытке использовать *
в начале регулярного выражения вы встречаетесь с неопределенным результатом, как это обозначено в стандарте POSIX.
Пример
Предположим, вы хотите использовать выражения, напоминающие глоббрацию, где *
служит в качестве шаблона для поиска любых символов. Однако в регулярных выражениях для поиска строк, содержащих ‘M’ или ‘K’, такие подходы не применимы.
Для указания на необходимость поиска строк, содержащих ‘M’ или ‘K’, вы можете использовать следующий синтаксис:
egrep "[MK]\s"
Это регулярное выражение [MK]\s
означает следующее:
[MK]
: найти любой символ, соответствующий либо ‘M’, либо ‘K’.\s
: найти пробел после символа ‘M’ или ‘K’.
То есть, данное выражение будет искать строки, содержащие ‘M ‘ или ‘K ‘, что соответствует вашему желаемому фильтру для исключения файлов со значением в мегабайтах или килобайтах.
Применение
-
Коррекция команды: измените ваше регулярное выражение на правильное, как указано выше. Это позволит избежать появления предупреждений.
-
Понимание разницы между глоббрацией и регулярными выражениями: важно помнить, что в Unix-подобных системах глобберация и регулярные выражения применяются в различных контекстах. Глобберация используется в командных оболочках для соответствия именам файлов, тогда как регулярные выражения применяются в утилитах к текстовым данным. Например,
*
в глобберации означает "любое количество любых символов", тогда как в регулярных выражениях он является квантификатором. -
Использование средств для объяснения регулярных выражений: существует множество онлайн-ресурсов и справочников, которые могут помочь лучше понять, как пользоваться регулярными выражениями. Обязательно используйте их для расширения своих знаний и улучшения навыков работы с компрометированными данными.
-
Проблемы совместимости: возможность использования
egrep
может зависеть от версии утилит, установленных в вашей системе. Напоминаю, что начиная с более новых версий GNU, утилитаegrep
считается устаревшей, и рекомендуется использоватьgrep -E
для работы с расширенными регулярными выражениями.
Таким образом, с небольшими изменениями в вводимой команде вы сможете избежать предупреждений, сделать проверку пространства на диске более эффективной и продолжить следить за состоянием файловой системы вашего устройства без лишних технических трудностей.