Comment obtenir une sous-chaîne à partir de la commande bash

8

Étant donné la sous-chaîne suivante donnée obtenue à partir de la commande df /dev/sdb1 | tail -n 1:

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

Je voudrais extraire 1952971772et à 74%partir de cette chaîne, l'utiliser dans un script bash.

Je sais que je pourrais utiliser des commandes de coupe ou quelque chose, mais cela ne fonctionnera plus si une taille change, par exemple.

J'ai également pensé à utiliser une expression régulière ou quelque chose, mais j'aimerais avoir l'approche la plus recommandée.

Merci d'avance!

Nicolas DUVOISIN
la source
2
Vous posez des questions sur le cas général, ou sur dfen particulier? Dans ce dernier cas, vous pouvez spécifier explicitement des champs de sortie particuliers, par exempledf --output=pcent /dev/sdb1
steeldriver
2
Vous utilisez la cutposition du caractère en ligne, ce qui le rend défaillant lorsque la longueur de la ligne change avec les fluctuations de la taille du fichier. Je crois que vous pouvez dire cutde sélectionner une colonne 2et une colonne 5délimitées par des espaces, mais je suis au téléphone et je ne peux pas rechercher et publier efficacement une réponse.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix Le nombre d'espaces peut varier, il est donc difficile de dire quel numéro de colonne est correct. cutverra une colonne après chaque délimiteur.
mook765
Je pense que deux espaces contigus ou plus comptent toujours comme un seul espace pour délimiter les colonnes
WinEunuuchs2Unix
@ WinEunuuchs2Unix correct :) J'ai les commandes d'un fichier texte que j'ai sous la main: D
Rinzwind

Réponses:

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

pour le pourcentage et

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

pour la taille.

Sans tail:

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

  • awk '{ print $2 }'
    obtient la 2ème colonne où plusieurs séparateurs comptent pour 1. La 2ème colonne est donc toujours la même pour votre système pour la 1ère partie de la commande.

  • NR vous donne le nombre total d'enregistrements en cours de traitement ou le numéro de ligne.

Rinzwind
la source
1
Ou si vous avez besoin des deux en une seule ligne df /home | awk '{print $2; print $5;}'.
Videonauth
3
Awk conserve la dernière ligne du ENDbloc donc au lieu d'utiliser tailsimplement l' utilisationawk 'END { print $2,$5}'
Kevin
Pour info, je vous ai déposé dans Meta :) meta.askubuntu.com/questions/18584/…
WinEunuuchs2Unix
8

Réponse modifiée

Comme l'a indiqué @kevin, vous pouvez utiliser awkpour sélectionner uniquement la dernière ligne et éviter d'utiliser du tout la queue en utilisant ENDet aussi si vous souhaitez imprimer deux colonnes à la fois, vous pouvez le faire:

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

Réponse originale

Vous ne pouvez sélectionner que les 2e colonnes:

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

$2indique la position des colonnes séparées par TAB. Vous pouvez l'utiliser cutcar il ne gère qu'une seule occurrence de TAB et ici il existe plusieurs TAB pour délimiter une colonne.

noraj
la source
3
Awk conserve la dernière ligne du ENDbloc donc au lieu d'utiliser tailsimplement l' utilisationawk 'END { print $2,$5}'
Kevin