“grep” свободное место от “df” производится

Если это - debian пакет, можно использовать эту команду.

grep install /var/log/dpkg.log
2
30.09.2014, 11:53
3 ответа

Если у вас есть версия grep, поддерживающая -P (perl-совместимый регрекс, PCRE) и -o (печатает только строку соответствия), вы можете сделать

df | grep -oP '/sda3.* \K\d+(?=\s+\d+%)' 

Объяснение

Здесь мы сопоставляем /sda3, затем как можно больше символов до тех пор, пока мы не найдем отрезок чисел (\d+), за которым следуют один или несколько пробелов (\s+), затем один или несколько чисел (\d+) и %. Конструкция foo(?=bar) является положительным поиском, она позволяет искать строку foo только в том случае, если за ней следует строка bar. \K - это трюк PCRE, который означает "отбрасывать все, что совпадает с этой точкой". В сочетании с -o он позволяет использовать строки, которые предшествуют шаблону, для фиксации совпадения, но не для печати.

-P-P без -P, все гораздо сложнее. Вам понадобится несколько проходов. Например:

df | grep -o '/sda3.*%' | grep -Eo '[0-9]+ *[0-9]+%' | grep -Eo '^[0-9]+'

Объяснение

Здесь первая grep идентифицирует правую строку и печатает все до %. Второй печатает самый длинный отрезок номеров перед пробелом и еще один отрезок номеров, заканчивающийся на %, а последний печатает самый длинный отрезок номеров, найденный в начале строки. Так как предыдущий отпечатал только свободный пробел и процент, то это и есть свободный пробел.

Если ваш grep даже не поддерживает -E, вы можете сделать:

df | grep -o '/sda3.*%' | grep -o '[0-9]* *[0-9]*%' | grep -o '[0-9][0-9]* '

Объяснение

Здесь мы не можем использовать + для "одного или более", поэтому для последнего grep нам необходимо указать по крайней мере одно число, за которым следует 0 или более ([0-9][0-9]*).


Если вы, конечно, можете использовать другие инструменты, то все станет намного проще:

df | sed -n '/sda3/{s/  */ /gp}' | cut -d' ' -f4

Объяснение

sed не будет печатать ничего (-n), если только текущая строка не совпадает с sda3 (/sda3/{}), а если совпадает, то заменяет все последовательные пробелы на один, позволяя использовать cut для печати 4-го поля.


Или

df | perl -lne 'm#/sda3.+\s(\d+)\s+\d+%# && print $1' 

Объяснение

В -l к каждому вызову печати добавляется новая строка, -n означает "чтение входной строки за строкой", а -e позволяет передать скрипт в командной строке. Сам скрипт соответствует sda3, затем любой отрезок символов до пробела, за которым следует одно или несколько чисел (\s(\d+)), затем пробел, за которым следует отрезок чисел, заканчивающийся на % (\s+\d+). В скобках указана интересующая нас часть, которая затем печатается как $1.


Или

df | tr -s ' ' $'\t' | grep sda3 | cut -f4

Объяснение

Здесь мы просто используем tr, чтобы преобразовать несколько последовательных пробелов в табуляцию (стандартный разделитель cut), затем grep для sda3 и вывести 4-ое поле.

7
27.01.2020, 21:49

Как использовать grep для решения проблемы в том виде, в котором вы спрашиваете, уже ответил;
Этот ответ о том, как решить проблему на примере - получение отдельного значения от df:

GNU df от coreutils имеет возможность указать столбцы, показанные в выходных данных:

$ df --output=avail /dev/sda3
  Avail
9816416

К сожалению, нет возможности подавить заголовок столбца - поэтому его нужно отбрасывать на дополнительном шаге, при помощи tail:

$ df --output=avail /dev/sda3 | tail -n 1
9816416

или grep, если вы предпочитаете:

$ df --output=avail /dev/sda3 | grep '[0-9]'
9816416
5
27.01.2020, 21:49

В /etc/exports указывается хост, на который выполняется экспорт.

Итак, вы напишете запись так:

/data 192.168.1.1(rw)

Предполагая, что вы используете какой-то Redhat. На клиенте установите с помощью:

mount 192.168.1.5:/data /data
-121--150812-

Некоторые утилиты, установленные в составе пакета, представляют собой perl скрипты:

$ head -n 1 /usr/bin/mysql_fix_extensions
#! /usr/bin/perl

$ head -n 1 /usr/bin/mysql_convert_table_format
#! /usr/bin/perl

и так далее...

-121--108703-

В зависимости от версии grep можно также использовать -o только для и -E для расширенного regex.

Таким образом, можно использовать

df | grep /dev/sda3 | grep -E -o "[[:digit:]]+[[:space:]]+[[:digit:]]+%" | grep -E -o ".+\s"

Для этого требуется символ % в качестве привязки для первой группы. После этого вы получите первые символы до пространства со 2-й груп.

2
27.01.2020, 21:49

Теги

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