egrep -v выдаёт предупреждение

Вопрос или проблема

На моем 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 ‘, что соответствует вашему желаемому фильтру для исключения файлов со значением в мегабайтах или килобайтах.

Применение

  1. Коррекция команды: измените ваше регулярное выражение на правильное, как указано выше. Это позволит избежать появления предупреждений.

  2. Понимание разницы между глоббрацией и регулярными выражениями: важно помнить, что в Unix-подобных системах глобберация и регулярные выражения применяются в различных контекстах. Глобберация используется в командных оболочках для соответствия именам файлов, тогда как регулярные выражения применяются в утилитах к текстовым данным. Например, * в глобберации означает "любое количество любых символов", тогда как в регулярных выражениях он является квантификатором.

  3. Использование средств для объяснения регулярных выражений: существует множество онлайн-ресурсов и справочников, которые могут помочь лучше понять, как пользоваться регулярными выражениями. Обязательно используйте их для расширения своих знаний и улучшения навыков работы с компрометированными данными.

  4. Проблемы совместимости: возможность использования egrep может зависеть от версии утилит, установленных в вашей системе. Напоминаю, что начиная с более новых версий GNU, утилита egrep считается устаревшей, и рекомендуется использовать grep -E для работы с расширенными регулярными выражениями.

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

Оцените материал
Добавить комментарий

Капча загружается...