регулярное выражение на оболочке?

Я хотел сделать несколько простых регулярных выражений, поэтому я пытаюсь получить 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

3
задан 20 October 2010 в 17:55

4 ответа

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 '%'
0
ответ дан 20 October 2010 в 17:55

По умолчанию grep ) печатает всю строку в соответствии с регулярным выражением, но вы можете указать, чтобы она выводила только совпадающую строку с опцией --only-matching:

df -h | egrep --only-matching '[[:digit:]]+%' | tr -d '%'

Обратите внимание, что :

  1. Синтаксис регулярного выражения grep / egrep немного отличается от синтаксиса регулярного выражения в стиле PERL, который вы опубликовали. Кроме того, существуют различия между синтаксисом регулярных выражений, поддерживаемым grep (называемым «POSIX basic regexp»), и синтаксисом, использованным в egrep (расширенное регулярное выражение).

  2. Невозможно указать egrep для вывода определенного подвыражения совпадения: будет напечатано все совпадение, включая знак %. Но вы можете удалить это с tr .

0
ответ дан 20 October 2010 в 17:55

Ради интереса вы можете использовать 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(), который извлекает все выход за один раз.

0
ответ дан 20 October 2010 в 17:55

Вместо того, чтобы использовать некоторый инструмент для изменения вывода df, необходимо просто использовать df --output опция ограничить вывод Вашими потребностями:

df --output=pcent,target

Получить только % - значения:

df --output=pcent | tail -n+2 | tr -d '[% ]'

Получить то же для /:

df --output=pcent / | tail -n+2 | tr -d '[% ]'
1
ответ дан 1 December 2019 в 17:25

Другие вопросы по тегам:

Похожие вопросы: