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

Существует очень простое решение этой проблемы. Вам просто нужно установить Ubuntu 14.04.1.

Я сделал это на древней машине с Ubuntu 14.04.1 , используя lubuntu-14.04.1-desktop-i386.iso.

Я думаю, что вы не следует загружать обновления во время установки (или лучше отключать сеть), и после первой загрузки просто используйте инструмент драйверов Ubuntu для установки NVIDIA 173.14.39. После перезагрузки вы можете полностью обновить свою систему до 14.04.4, и это не приведет к разрушению зависимостей NVIDIA.

Переход к этому драйверу дал мне небольшое увеличение производительности. Некоторые старые игры работают лучше (через PlayOnLinux), и он даже решил проблему с одной игрой. Видео также играет немного лучше (включая HTML5).

Просто не обновляйте свой дистрибутив выше 14.04:)

Вот ссылка, где я получил свой ISO:

]

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

27 ответов

Просто для удовольствия вы можете использовать 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
ответ дан 25 July 2018 в 23:03

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 / shm then:

df | awk '/\/dev\/shm$/ {print $5;}' | tr -d '%'

или root:

df | awk '/\/$/ {print $5;}' | tr -d '%'
1
ответ дан 25 July 2018 в 23:03
  • 1
    Я пытаюсь получить только значение, а не знак%, поэтому я могу назначить int переменной bash. – user 20 October 2010 в 19:11
  • 2
    Первая строка в любом случае сообщается в вашей версии, лучше df | awk 'NR > 1 { print $5, $6 }' – enzotib 20 October 2010 в 19:44
  • 3
    исправьте вас, enzotib; исправлено; Благодарю. – msw 20 October 2010 в 19:56

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

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

Обратите внимание:

Синтаксис grep / egrep regexp немного отличается от синтаксиса regexp в стиле PERL, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp») и тем, который используется в egrep (расширенное регулярное выражение). Невозможно указать egrep для вывода определенного подвыражения для совпадения: будет распечатано все совпадение, включая знак %. Но вы можете разделить его на tr.
0
ответ дан 25 July 2018 в 23:03
  • 1
    странный синтаксис, почему я не могу захватить несколько групп? возможно, я должен изучить python или perl и сделать это оттуда: x – user 20 October 2010 в 21:47
  • 2
    Просто для суеты: вы можете иметь несколько групп захвата в регулярном выражении egrep , нет возможности выбрать, какой из них следует печатать; вы всегда получаете полный матч. – Riccardo Murri 20 October 2010 в 22:35
  • 3
    grep -P может использовать синтаксис Perl-regexp (но он экспериментальный, поэтому, вероятно, не работает во всех случаях) – JanC 20 October 2010 в 23:18

Просто для удовольствия вы можете использовать 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
ответ дан 27 July 2018 в 02:17

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 / shm then:

df | awk '/\/dev\/shm$/ {print $5;}' | tr -d '%'

или root:

df | awk '/\/$/ {print $5;}' | tr -d '%'
1
ответ дан 27 July 2018 в 02:17
  • 1
    Я пытаюсь получить только значение, а не знак%, поэтому я могу назначить int переменной bash. – user 20 October 2010 в 19:11
  • 2
    Первая строка в любом случае сообщается в вашей версии, лучше df | awk 'NR > 1 { print $5, $6 }' – enzotib 20 October 2010 в 19:44
  • 3
    исправьте вас, enzotib; исправлено; Благодарю. – msw 20 October 2010 в 19:56

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

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

Обратите внимание:

Синтаксис grep / egrep regexp немного отличается от синтаксиса regexp в стиле PERL, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp») и тем, который используется в egrep (расширенное регулярное выражение). Невозможно указать egrep для вывода определенного подвыражения для совпадения: будет распечатано все совпадение, включая знак %. Но вы можете разделить его на tr.
0
ответ дан 27 July 2018 в 02:17
  • 1
    странный синтаксис, почему я не могу захватить несколько групп? возможно, я должен изучить python или perl и сделать это оттуда: x – user 20 October 2010 в 21:47
  • 2
    Просто для суеты: вы можете иметь несколько групп захвата в регулярном выражении egrep , нет возможности выбрать, какой из них следует печатать; вы всегда получаете полный матч. – Riccardo Murri 20 October 2010 в 22:35
  • 3
    grep -P может использовать синтаксис Perl-regexp (но он экспериментальный, поэтому, вероятно, не работает во всех случаях) – JanC 20 October 2010 в 23:18

Просто для удовольствия вы можете использовать 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
ответ дан 31 July 2018 в 13:47

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 / shm then:

df | awk '/\/dev\/shm$/ {print $5;}' | tr -d '%'

или root:

df | awk '/\/$/ {print $5;}' | tr -d '%'
1
ответ дан 31 July 2018 в 13:47
  • 1
    Я пытаюсь получить только значение, а не знак%, поэтому я могу назначить int переменной bash. – user 20 October 2010 в 19:11
  • 2
    Первая строка в любом случае сообщается в вашей версии, лучше df | awk 'NR > 1 { print $5, $6 }' – enzotib 20 October 2010 в 19:44
  • 3
    исправьте вас, enzotib; исправлено; Благодарю. – msw 20 October 2010 в 19:56

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

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

Обратите внимание:

Синтаксис grep / egrep regexp немного отличается от синтаксиса regexp в стиле PERL, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp») и тем, который используется в egrep (расширенное регулярное выражение). Невозможно указать egrep для вывода определенного подвыражения для совпадения: будет распечатано все совпадение, включая знак %. Но вы можете разделить его на tr.
0
ответ дан 31 July 2018 в 13:47
  • 1
    странный синтаксис, почему я не могу захватить несколько групп? возможно, я должен изучить python или perl и сделать это оттуда: x – user 20 October 2010 в 21:47
  • 2
    Просто для суеты: вы можете иметь несколько групп захвата в регулярном выражении egrep , нет возможности выбрать, какой из них следует печатать; вы всегда получаете полный матч. – Riccardo Murri 20 October 2010 в 22:35
  • 3
    grep -P может использовать синтаксис Perl-regexp (но он экспериментальный, поэтому, вероятно, не работает во всех случаях) – JanC 20 October 2010 в 23:18

Просто для удовольствия вы можете использовать Python для извлечения использования диска.

В следующем фрагменте кода будет отображаться значение при первом вхождении шаблона (в вашем случае 16 ):

  import subprocess import re print re.search ('(\ d +)% /', subprocess.Popen (["df"], stdout = subprocess.PIPE) .communicate (  ) [0]). Group (1)  

Если вы хотите получить значения из каждой строки, более длинный код выполнит трюк:

   #! / usr / bin / env python # - * - кодирование: utf-8 - * - импорт подпроцесса import re p = subprocess.Popen (["df"], stdout = subprocess.PIPE) для строки в p  .stdout: use = re.search ('(\ d +)% /', line.rstrip ()), если использование! = None: print use.group (1)  

В основном это работает так же, как только он читает вывод по очереди в отличие от вызова Popen.communicate () , который извлекает весь вывод за один раз.

0
ответ дан 2 August 2018 в 04:24

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

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

Обратите внимание:

  1. Синтаксис grep / egrep regexp немного отличается от PERL -style regexp синтаксис, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp»), и тем, который используется в egrep (расширенное регулярное выражение).
  2. Невозможно скажите egrep, чтобы вывести определенное подвыражение соответствия: будет распечатано все совпадение, включая знак % . Но вы можете удалить его с помощью tr .
0
ответ дан 2 August 2018 в 04:24

awk очень хорошо подходит для этой задачи:

  df |  awk 'NR & gt;  1 {print $ 5, $ 6;} ' 

говорит пропустить первую строку NR & gt; 1 , а затем на всех остальных строках напечатайте 5-е и 6-е поля, разделенные пробелами. Это дает:

  65% / 1% / dev 1% / dev / shm  

добавлено в ответ на комментарий:

Извините, демонстрационный сайт не соответствует вашему описанию. Хотя есть более простые способы сделать это, вот та же цепочка с добавлением tr , поэтому у вас есть еще один инструмент в вашем поле:

  df |  awk 'NR & gt;  1 {print $ 5;} '|  tr -d '%'  

, и если вы только хотели его (например,) / dev / shm, то:

  df |  awk '/ \ / dev \ / shm $ / {print $ 5;}' |  tr -d '%'  

или корень:

  df |  awk '/ \ / $ / {print $ 5;}' |  tr -d '%'  
1
ответ дан 2 August 2018 в 04:24

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

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

Обратите внимание:

  1. Синтаксис grep / egrep regexp немного отличается от PERL -style regexp синтаксис, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp»), и тем, который используется в egrep (расширенное регулярное выражение).
  2. Невозможно скажите egrep, чтобы вывести определенное подвыражение соответствия: будет распечатано все совпадение, включая знак % . Но вы можете удалить его с помощью tr .
0
ответ дан 4 August 2018 в 20:55

awk очень хорошо подходит для этой задачи:

  df |  awk 'NR & gt;  1 {print $ 5, $ 6;} ' 

говорит пропустить первую строку NR & gt; 1 , а затем на всех остальных строках напечатайте 5-е и 6-е поля, разделенные пробелами. Это дает:

  65% / 1% / dev 1% / dev / shm  

добавлено в ответ на комментарий:

Извините, демонстрационный сайт не соответствует вашему описанию. Хотя есть более простые способы сделать это, вот та же цепочка с добавлением tr , поэтому у вас есть еще один инструмент в вашем поле:

  df |  awk 'NR & gt;  1 {print $ 5;} '|  tr -d '%'  

, и если вы только хотели его (например,) / dev / shm, то:

  df |  awk '/ \ / dev \ / shm $ / {print $ 5;}' |  tr -d '%'  

или корень:

  df |  awk '/ \ / $ / {print $ 5;}' |  tr -d '%'  
1
ответ дан 4 August 2018 в 20: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 # - * - кодирование: utf-8 - * - импорт подпроцесса import re p = subprocess.Popen (["df"], stdout = subprocess.PIPE) для строки в p  .stdout: use = re.search ('(\ d +)% /', line.rstrip ()), если использование! = None: print use.group (1)  

В основном это работает так же, как только он читает вывод по очереди в отличие от вызова Popen.communicate () , который извлекает весь вывод за один раз.

0
ответ дан 4 August 2018 в 20:55

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

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

Обратите внимание:

  1. Синтаксис grep / egrep regexp немного отличается от PERL -style regexp синтаксис, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp»), и тем, который используется в egrep (расширенное регулярное выражение).
  2. Невозможно скажите egrep, чтобы вывести определенное подвыражение соответствия: будет распечатано все совпадение, включая знак % . Но вы можете удалить его с помощью tr .
0
ответ дан 6 August 2018 в 04:28

awk очень хорошо подходит для этой задачи:

  df |  awk 'NR & gt;  1 {print $ 5, $ 6;} ' 

говорит пропустить первую строку NR & gt; 1 , а затем на всех остальных строках напечатайте 5-е и 6-е поля, разделенные пробелами. Это дает:

  65% / 1% / dev 1% / dev / shm  

добавлено в ответ на комментарий:

Извините, демонстрационный сайт не соответствует вашему описанию. Хотя есть более простые способы сделать это, вот та же цепочка с добавлением tr , поэтому у вас есть еще один инструмент в вашем поле:

  df |  awk 'NR & gt;  1 {print $ 5;} '|  tr -d '%'  

, и если вы только хотели его (например,) / dev / shm, то:

  df |  awk '/ \ / dev \ / shm $ / {print $ 5;}' |  tr -d '%'  

или корень:

  df |  awk '/ \ / $ / {print $ 5;}' |  tr -d '%'  
1
ответ дан 6 August 2018 в 04:28

Просто для удовольствия вы можете использовать Python для извлечения использования диска.

В следующем фрагменте кода будет отображаться значение при первом вхождении шаблона (в вашем случае 16 ):

  import subprocess import re print re.search ('(\ d +)% /', subprocess.Popen (["df"], stdout = subprocess.PIPE) .communicate (  ) [0]). Group (1)  

Если вы хотите получить значения из каждой строки, более длинный код выполнит трюк:

   #! / usr / bin / env python # - * - кодирование: utf-8 - * - импорт подпроцесса import re p = subprocess.Popen (["df"], stdout = subprocess.PIPE) для строки в p  .stdout: use = re.search ('(\ d +)% /', line.rstrip ()), если использование! = None: print use.group (1)  

В основном это работает так же, как только он читает вывод по очереди в отличие от вызова Popen.communicate () , который извлекает весь вывод за один раз.

0
ответ дан 6 August 2018 в 04:28

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

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

Обратите внимание:

  1. Синтаксис grep / egrep regexp немного отличается от PERL -style regexp синтаксис, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp»), и тем, который используется в egrep (расширенное регулярное выражение).
  2. Невозможно скажите egrep, чтобы вывести определенное подвыражение соответствия: будет распечатано все совпадение, включая знак % . Но вы можете удалить его с помощью tr .
0
ответ дан 7 August 2018 в 22:36

awk очень хорошо подходит для этой задачи:

  df |  awk 'NR & gt;  1 {print $ 5, $ 6;} ' 

говорит пропустить первую строку NR & gt; 1 , а затем на всех остальных строках напечатайте 5-е и 6-е поля, разделенные пробелами. Это дает:

  65% / 1% / dev 1% / dev / shm  

добавлено в ответ на комментарий:

Извините, демонстрационный сайт не соответствует вашему описанию. Хотя есть более простые способы сделать это, вот та же цепочка с добавлением tr , поэтому у вас есть еще один инструмент в вашем поле:

  df |  awk 'NR & gt;  1 {print $ 5;} '|  tr -d '%'  

, и если вы только хотели его (например,) / dev / shm, то:

  df |  awk '/ \ / dev \ / shm $ / {print $ 5;}' |  tr -d '%'  

или корень:

  df |  awk '/ \ / $ / {print $ 5;}' |  tr -d '%'  
1
ответ дан 7 August 2018 в 22:36

Просто для удовольствия вы можете использовать Python для извлечения использования диска.

В следующем фрагменте кода будет отображаться значение при первом вхождении шаблона (в вашем случае 16 ):

  import subprocess import re print re.search ('(\ d +)% /', subprocess.Popen (["df"], stdout = subprocess.PIPE) .communicate (  ) [0]). Group (1)  

Если вы хотите получить значения из каждой строки, более длинный код выполнит трюк:

   #! / usr / bin / env python # - * - кодирование: utf-8 - * - импорт подпроцесса import re p = subprocess.Popen (["df"], stdout = subprocess.PIPE) для строки в p  .stdout: use = re.search ('(\ d +)% /', line.rstrip ()), если использование! = None: print use.group (1)  

В основном это работает так же, как только он читает вывод по очереди в отличие от вызова Popen.communicate () , который извлекает весь вывод за один раз.

0
ответ дан 7 August 2018 в 22:36

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

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

Обратите внимание:

  1. Синтаксис grep / egrep regexp немного отличается от PERL -style regexp синтаксис, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp»), и тем, который используется в egrep (расширенное регулярное выражение).
  2. Невозможно скажите egrep, чтобы вывести определенное подвыражение соответствия: будет распечатано все совпадение, включая знак % . Но вы можете удалить его с помощью tr .
0
ответ дан 10 August 2018 в 10:43

Просто для удовольствия вы можете использовать Python для извлечения использования диска.

В следующем фрагменте кода будет отображаться значение при первом вхождении шаблона (в вашем случае 16 ):

  import subprocess import re print re.search ('(\ d +)% /', subprocess.Popen (["df"], stdout = subprocess.PIPE) .communicate (  ) [0]). Group (1)  

Если вы хотите получить значения из каждой строки, более длинный код выполнит трюк:

   #! / usr / bin / env python # - * - кодирование: utf-8 - * - импорт подпроцесса import re p = subprocess.Popen (["df"], stdout = subprocess.PIPE) для строки в p  .stdout: use = re.search ('(\ d +)% /', line.rstrip ()), если использование! = None: print use.group (1)  

В основном это работает так же, как только он читает вывод по очереди в отличие от вызова Popen.communicate () , который извлекает весь вывод за один раз.

0
ответ дан 10 August 2018 в 10:43

awk очень хорошо подходит для этой задачи:

  df |  awk 'NR & gt;  1 {print $ 5, $ 6;} ' 

говорит пропустить первую строку NR & gt; 1 , а затем на всех остальных строках напечатайте 5-е и 6-е поля, разделенные пробелами. Это дает:

  65% / 1% / dev 1% / dev / shm  

добавлено в ответ на комментарий:

Извините, демонстрационный сайт не соответствует вашему описанию. Хотя есть более простые способы сделать это, вот та же цепочка с добавлением tr , поэтому у вас есть еще один инструмент в вашем поле:

  df |  awk 'NR & gt;  1 {print $ 5;} '|  tr -d '%'  

, и если вы только хотели его (например,) / dev / shm, то:

  df |  awk '/ \ / dev \ / shm $ / {print $ 5;}' |  tr -d '%'  

или корень:

  df |  awk '/ \ / $ / {print $ 5;}' |  tr -d '%'  
1
ответ дан 10 August 2018 в 10:43

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

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

Обратите внимание:

  1. Синтаксис grep / egrep regexp немного отличается от PERL -style regexp синтаксис, который вы опубликовали. Кроме того, существуют различия между синтаксисом regexp, поддерживаемым grep (называемым «POSIX basic regexp»), и тем, который используется в egrep (расширенное регулярное выражение).
  2. Невозможно скажите egrep, чтобы вывести определенное подвыражение соответствия: будет распечатано все совпадение, включая знак % . Но вы можете удалить его с помощью tr .
0
ответ дан 13 August 2018 в 17:17
  • 1
    странный синтаксис, почему я не могу захватить несколько групп? возможно, я должен изучить python или perl и сделать это оттуда: x – user 20 October 2010 в 21:47
  • 2
    Просто для суеты: вы можете иметь несколько групп захвата в регулярном выражении egrep , просто нет возможности выбрать, какой из них следует печатать; вы всегда получаете полный матч. – Riccardo Murri 20 October 2010 в 22:35
  • 3
    grep -P может использовать синтаксис Perl-regexp (но он экспериментальный, поэтому, вероятно, не работает во всех случаях) – JanC 20 October 2010 в 23:18

Просто для удовольствия вы можете использовать Python для извлечения использования диска.

В следующем фрагменте кода будет отображаться значение при первом вхождении шаблона (в вашем случае 16 ):

  import subprocess import re print re.search ('(\ d +)% /', subprocess.Popen (["df"], stdout = subprocess.PIPE) .communicate (  ) [0]). Group (1)  

Если вы хотите получить значения из каждой строки, более длинный код выполнит трюк:

   #! / usr / bin / env python # - * - кодирование: utf-8 - * - импорт подпроцесса import re p = subprocess.Popen (["df"], stdout = subprocess.PIPE) для строки в p  .stdout: use = re.search ('(\ d +)% /', line.rstrip ()), если использование! = None: print use.group (1)  

В основном это работает так же, как только он читает вывод по очереди в отличие от вызова Popen.communicate () , который извлекает весь вывод за один раз.

0
ответ дан 13 August 2018 в 17:17

awk очень хорошо подходит для этой задачи:

  df |  awk 'NR & gt;  1 {print $ 5, $ 6;} ' 

говорит пропустить первую строку NR & gt; 1 , а затем на всех остальных строках напечатайте 5-е и 6-е поля, разделенные пробелами. Это дает:

  65% / 1% / dev 1% / dev / shm  

добавлено в ответ на комментарий:

Извините, демонстрационный сайт не соответствует вашему описанию. Хотя есть более простые способы сделать это, вот та же цепочка с добавлением tr , поэтому у вас есть еще один инструмент в вашем поле:

  df |  awk 'NR & gt;  1 {print $ 5;} '|  tr -d '%'  

, и если вы только хотели его (например,) / dev / shm, то:

  df |  awk '/ \ / dev \ / shm $ / {print $ 5;}' |  tr -d '%'  

или корень:

  df |  awk '/ \ / $ / {print $ 5;}' |  tr -d '%'  
1
ответ дан 13 August 2018 в 17:17
  • 1
    Я пытаюсь получить только значение, а не знак%, поэтому я могу назначить int переменной bash. – user 20 October 2010 в 19:11
  • 2
    Первая строка в любом случае представлена ​​в вашей версии, лучше df | awk 'NR & gt; 1 {print $ 5, $ 6} ' – enzotib 20 October 2010 в 19:44
  • 3
    исправьте вас, enzotib; исправлено; Благодарю. – msw 20 October 2010 в 19:56

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

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