Как получить подстроку из команды bash

Учитывая следующую подстроку, полученную из команды df /dev/sdb1 | tail -n 1:

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

Я хотел бы извлечь из этой строки 1952971772 и 74% это в скрипте bash.

Я знаю, что мог бы использовать некоторые команды обрезки или что-то подобное, но это больше не будет работать, например, при изменении размера.

У меня также были мысли об использовании регулярных выражений или чего-то еще, но я бы хотел использовать наиболее рекомендуемый подход.

Спасибо заранее!

8
задан 30 April 2019 в 15:12

3 ответа

$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

для процента и

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

для размера.

Без tail:

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    получает 2-й столбец, где несколько разделителей считаются как 1. Таким образом, 2-й Столбец всегда одинаков для вашей системы для первой части команды.

  • NR дает вам общее количество обрабатываемых записей или номер строки.

0
ответ дан 30 April 2019 в 15:12

При публикации комментариев со своего смартфона (без bash для тестирования) я ошибался, считая, что команда cut (сама по себе) может идентифицировать столбцы, разделенные переменным количеством пробелов.

Необработанный вывод:

$ df /dev/nvme0n1p4

Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/nvme0n1p4 380829660 164179036 216650624  44% /mnt/c

OP хочет столбцы 2 и 5. Команда cut сама по себе не будет работать:

$ df /dev/nvme0n1p4 | cut -d ' ' -f2,5

380829660 
  • -d ' ' устанавливает разделитель в один пробел между столбцами, которые портят вывод.

Когда нужно использовать tr, чтобы «сжать» несколько пробелов в одно:

$ df /dev/nvme0n1p4 | tr -s ' ' | cut -d ' ' -f2,5

1K-blocks Use%
380829660 44%

Полный вывод в соответствии со спецификациями OP:

$ df /dev/nvme0n1p4 | tail -n 1 | tr -s ' ' | cut -d ' ' -f2,5
380829660 44%
0
ответ дан 30 April 2019 в 15:12

Отредактированный ответ

Как сказал @kevin, вы можете использовать awk, чтобы выбрать только последнюю строку и вообще не использовать хвост, используя END, а также если вы хотите напечатать два столбца одновременно Вы можете сделать это:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%
<час>

Исходный ответ

Вы можете выбрать только 2-е столбцы:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

Где $2 указывает положение Таблицы разделены столбцами. Вы можете использовать cut, потому что он обрабатывает только одно вхождение TAB, и здесь есть несколько TAB для разделения столбца.

0
ответ дан 30 April 2019 в 15:12

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

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