Comment obtenir la nième colonne avec le délimiteur regexp

En gros, je reçois la ligne de la commande ls -la :

 -rw-r--r-- 13 ondrejodchazel staff 442 Dec 10 16:23 some_file 

et que vous voulez obtenir la taille du fichier (442). J’ai essayé cut commandes cut et sed , mais je n’ai pas réussi. En utilisant uniquement les outils UNIX de base (cut, sed, awk …), comment puis-je obtenir une colonne spécifique à partir de stdin, où le délimiteur est / +/ regexp?

Si vous voulez le faire avec la cut vous devez d’abord insérer l’espace ( tr -s ' ' ) car la cut ne supporte pas + . Cela devrait fonctionner:

 ls -la | tr -s ' ' | cut -d' ' -f 5 

C’est un peu plus de travail quand on le fait avec sed (GNU sed):

 ls -la | sed -r 's/([^ ]+ +){4}([^ ]+).*/\2/' 

Légèrement plus de poinçonnage si vous utilisez l’alternative grep (GNU grep):

 ls -la | grep -Eo '[^ ]+( +[^ ]+){4}' | grep -Eo '[^ ]+$' 

Analyser les résultats est plus difficile que vous ne le pensez. Utilisez plutôt un outil dédié tel que stat .

 size=$(stat -c '%s' some_file) 

Un moyen ls -la some_file | awk '{print $5}' ls -la some_file | awk '{print $5}' pourrait se casser si les nombres utilisent un espace comme séparateur de milliers (ce qui est courant dans certains environnements européens).

Voir aussi Pourquoi vous ne devez pas parsingr la sortie de ls (1) .

Pipe votre sortie avec:

 awk '{print $5}' 

Ou même mieux d’utiliser la commande stat comme ceci (sur Mac):

 stat -f "%z" yourFile 

Ou (sous Linux)

 stat -c "%s" yourFile 

cela produira la taille du fichier en octets.