Я хотел сделать несколько простых регулярных выражений, поэтому я пытаюсь получить 16. Я попробовал grep, но я не вижу, как записать \ 1 или $ 1, чтобы выводить только данные захвата, и я попытался sed, но я думаю, что сделал это неправильно из-за побега я не знаком с. В любом случае, мое регулярное выражение это
(\d+)\%\s*/$
Строка
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/xvda 15997904 2404540 12943248 16% /
tmpfs 252456 0 252456 0% /lib/init/rw
tmpfs 252456 36 252420 1% /dev/shm
и на этом сайте вывод именно то, что я хочу (наведите курсор мыши, чтобы увидеть групповые совпадения) http://regexr.com?2sd12
awk очень хорошо подходит для этой задачи:
df | awk 'NR > 1 {print $5, $6;}'
говорит, что пропустите первую строку NR > 1
, а затем на всех других строках выведите 5-е и 6-е разделенные пробелами поля. Это дает:
65% /
1% /dev
1% /dev/shm
Демонстрационный сайт не соответствует вашему описанию, извините. Хотя есть более простые способы сделать это, здесь та же цепочка с добавленным tr
, так что у вас есть еще один инструмент в вашем ящике:
df | awk 'NR > 1 {print $5;}' | tr -d '%'
и если вы хотели его только для (например) / dev / шм тогда:
df | awk '/\/dev\/shm$/ {print $5;}' | tr -d '%'
или корень:
df | awk '/\/$/ {print $5;}' | tr -d '%'
По умолчанию grep ) печатает всю строку в соответствии с регулярным выражением, но вы можете указать, чтобы она выводила только совпадающую строку с опцией --only-matching
:
df -h | egrep --only-matching '[[:digit:]]+%' | tr -d '%'
Обратите внимание, что :
Синтаксис регулярного выражения grep / egrep немного отличается от синтаксиса регулярного выражения в стиле PERL, который вы опубликовали. Кроме того, существуют различия между синтаксисом регулярных выражений, поддерживаемым grep (называемым «POSIX basic regexp»), и синтаксисом, использованным в egrep (расширенное регулярное выражение).
Невозможно указать egrep для вывода определенного подвыражения совпадения: будет напечатано все совпадение, включая знак %
. Но вы можете удалить это с tr .
Ради интереса вы можете использовать Python для извлечения информации об использовании диска.
Следующий фрагмент кода отобразит значение при первом появлении шаблона (в вашем случае 16 ):
import subprocess
import re
print re.search('(\d+)% /', subprocess.Popen(["df"], stdout=subprocess.PIPE).communicate()[0]).group(1)
Если вы хотите получить значения из каждая строка, немного более длинный код сделает свое дело:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
import re
p = subprocess.Popen(["df"], stdout=subprocess.PIPE)
for line in p.stdout:
usage = re.search('(\d+)% /', line.rstrip())
if usage != None:
print usage.group(1)
По сути, он работает одинаково, просто он читает строку построчно в отличие от вызова Popen.communicate()
, который извлекает все выход за один раз.
Вместо того, чтобы использовать некоторый инструмент для изменения вывода df
, необходимо просто использовать df
--output
опция ограничить вывод Вашими потребностями:
df --output=pcent,target
Получить только % - значения:
df --output=pcent | tail -n+2 | tr -d '[% ]'
Получить то же для /
:
df --output=pcent / | tail -n+2 | tr -d '[% ]'