Як отримати підрядку з команди bash


8

З огляду на наступну підрядку, отриману з команди df /dev/sdb1 | tail -n 1:

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

Я хотів би екстракт 1952971772і 74%з цього рядка, щоб використовувати його в БАШЕЄВ скрипті.

Я знаю, що я міг би скористатись командами скорочення чи іншим, але це більше не працюватиме, якщо розмір зміниться, наприклад.

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

Спасибі заздалегідь!


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 дає загальну кількість записів, що обробляються, або номер рядка.


1
Або якщо вам потрібно обоє в одному рядку df /home | awk '{print $2; print $5;}'.
Videonauth

3
Awk зберігає останній рядок у ENDблоці, тому замість tailпростого використанняawk 'END { print $2,$5}'
Кевін

FYI I name скинув вас у Meta :) meta.askubuntu.com/questions/18584/…
WinEunuuchs2Unix

8

Відредагована відповідь

Як заявив @kevin, ви можете використовувати awkлише останній рядок і взагалі уникати використання хвоста, ENDа також якщо ви хочете надрукувати відразу два стовпці, ви можете це зробити:

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

Оригінальна відповідь

Ви можете вибрати лише 2-й стовпці:

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

Де $2вказується положення стовпців, розділених TAB. Ви можете використовувати, cutоскільки він обробляє лише одне виникнення TAB, і тут є декілька таблиць TAB для розмежування стовпця.


3
Awk зберігає останній рядок у ENDблоці, тому замість tailпростого використанняawk 'END { print $2,$5}'
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.