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

8

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

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

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

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

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

Заранее спасибо!

Николя ДУВОЙСИН
источник
2
Вы спрашиваете об общем случае или о dfконкретном? Если последнее, вы можете указать конкретные выходные поля, например,df --output=pcent /dev/sdb1
steeldriver
2
Вы используете cutположение символа в строке, что приводит к сбою при изменении длины строки в зависимости от размера файла. Я полагаю, что вы можете сказать, cutчтобы выбрать столбец 2и столбец, 5выделенный пробелами, но я разговариваю по телефону и не могу исследовать и эффективно опубликовать ответ.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix Количество пробелов может варьироваться, поэтому трудно сказать, какой номер столбца является правильным. cutбудет видеть один столбец после каждого разделителя.
mook765
Я думаю, что два или более смежных пробела все еще считаются одним пробелом для разграничения столбцов
WinEunuuchs2Unix
@ WinEunuuchs2Unix правильно :) У меня есть команды из текстового файла, который у меня под рукой: D
Rinzwind

Ответы:

6
$ 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-й столбец всегда одинаков для вашей системы для 1-й части команды.

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

Rinzwind
источник
1
Или если вам нужно оба в одной строке df /home | awk '{print $2; print $5;}'.
Видеонавт
3
Awk сохраняет последнюю строку в ENDблоке, поэтому вместо использования tailпросто используйтеawk 'END { print $2,$5}'
Кевин
К вашему сведению, я назвал вас в Meta :) meta.askubuntu.com/questions/18584/…
WinEunuuchs2Unix
8

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

Как сказал @kevin, вы можете использовать, awkчтобы выбрать только последнюю строку и вообще не использовать tail, используя команду, 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 для разделения столбца.

noraj
источник
3
Awk сохраняет последнюю строку в ENDблоке, поэтому вместо использования tailпросто используйтеawk 'END { print $2,$5}'
Кевин