Jak uzyskać podciąg z komendy bash

8

Biorąc pod uwagę następujący podciąg otrzymany z polecenia df /dev/sdb1 | tail -n 1:

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

Chciałbym wyodrębnić 1952971772i 74%z tego ciągu, aby użyć go w skrypcie bash.

Wiem, że mógłbym użyć niektórych poleceń cięcia lub czegoś takiego, ale to nie będzie działać, jeśli na przykład zmieni się rozmiar.

Miałem też przemyślenia na temat użycia wyrażenia regularnego lub czegoś takiego, ale chciałbym mieć najbardziej zalecane podejście.

Z góry dziękuję!

Nicolas DUVOISIN
źródło
2
Pytasz o ogólny przypadek, czy dfw szczególności o? Jeśli to drugie, możesz podać konkretne pola wyjściowe, np.df --output=pcent /dev/sdb1
steeldriver 30.04.19
2
Używasz cutna pozycji znaku w linii, co powoduje, że zawodzi, gdy długość linii zmienia się wraz ze zmianami wielkości pliku. Wierzę, że możesz powiedzieć, cutaby wybrać kolumnę 2i kolumnę 5wyznaczoną spacjami, ale rozmawiam przez telefon i nie mogę zbadać ani skutecznie opublikować odpowiedzi.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix Liczba spacji może się różnić, więc trudno powiedzieć, która kolumna jest poprawna. cutzobaczy każdą kolumnę po każdym separatorze.
mook765
Dwa lub więcej sąsiadujących obowiązuje nadal liczyć jako pojedyncze miejsca na wyznaczającej kolumny myślę
WinEunuuchs2Unix
@ WinEunuuchs2Unix poprawne :) I polecenia z pliku tekstowego, który mam pod ręką: D
Rinzwind 30.04.19

Odpowiedzi:

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

dla procentu i

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

dla rozmiaru.

Bez tail:

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

  • awk '{ print $2 }'
    pobiera drugą kolumnę, w której wiele separatorów liczy się jako 1. Tak więc druga kolumna jest zawsze taka sama dla twojego systemu dla pierwszej części polecenia.

  • NR daje całkowitą liczbę przetwarzanych rekordów lub numer linii.

Rinzwind
źródło
1
Lub jeśli potrzebujesz obu w jednej linii df /home | awk '{print $2; print $5;}'.
Videonauth,
3
Awk utrzymuje ostatnią linię w ENDbloku, więc zamiast używać tailpo prostu użyjawk 'END { print $2,$5}'
Kevin
Do waszej
nazwy dodałem
8

Edytowana odpowiedź

Jak stwierdził @kevin, możesz użyć, awkaby wybrać tylko ostatnią linię i w ogóle uniknąć używania ogona za pomocą, ENDa także, jeśli chcesz wydrukować dwie kolumny na raz, możesz to zrobić:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

Oryginalna odpowiedź

Możesz wybrać tylko 2 kolumny:

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

Gdzie $2wskazuje pozycję kolumn oddzielonych TAB. Możesz użyć, cutponieważ obsługuje tylko jedno wystąpienie TAB, a tutaj jest wiele tabulatorów do rozdzielania kolumny.

noraj
źródło
3
Awk utrzymuje ostatnią linię w ENDbloku, więc zamiast używać tailpo prostu użyjawk 'END { print $2,$5}'
Kevin