LINUX.ORG.RU
решено ФорумAdmin

Помогите с grep и регулярками

 


0

1

Нужно вычленить количество доступного места на диске /dev/sdb3. Вот вывод до grep с регуляркой:

df /dev/sdb3
Файл.система   1K-blocks Использовано Доступно Использовано% Cмонтировано в
/dev/sdb3       95990980       567180 90524604            1% /home

df /dev/sdb3 | grep /dev/sdb3
/dev/sdb3       95990980       565664 90526120            1% /home
Вот я использую регулярку:
df /dev/sdb3 | grep /dev/sdb3 | grep -Eo '(?:\D)(\d*)(?:\s*)(?:\d{1,3}%)'
И ничего не выводит.

Тестировал саму регулярку на сайте для тестирования регулярок, там она все находит, регулярка составлена корректно.

Что я делаю не так?

В даннном случае простейший правильный grep - это awk:

df /dev/sdb3 | grep /dev | awk '{print $4}'

blexey ★★★★★
()

Что я делаю не так?

\d для grep это [[:digit:]], \s тоже другой, look-ahead/look-behind может и вовсе не доступны. Регулярные выражения имеют разный синтаксис, надо смотреть на диалект перед использованием.

xaizek ★★★★★
()
Ответ на: комментарий от AnDoR

Хм, прочёл перед ответом man df, но там не нашёл. Да, и пример у меня не работает:

df: unrecognized option `--output=avail'
$ df --version
df (GNU coreutils) 5.97

anonymous
()

df |awk '/sdc1/ {print $(NF-2)}'

anonymous
()
Ответ на: комментарий от anonymous

или так:

df /dev/sdb3 | perl -nale '/dev\/sdb3/ && print $F[3]'

anonymous
()

Если хочешь использовать Perl-like regexp, то ключ нужен не -E, а -P.

~% df /dev/mapper/ki00-root | grep /dev/mapper/ki00-root | grep -Po '(?:\D)(\d*)(?:\s*)(?:\d{1,3}%)'
 5220808           71%

nbw ★★★
()
Ответ на: комментарий от beastie

Угу, чё-то протупил, awk ведь сам себе grep.

blexey ★★★★★
()
sed -rn '/sda3/s/(\S+\s+){4}(\S+).*/\1/p'
emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.