web-dev-qa-db-fra.com

Bash: comment couper les espaces avant d'utiliser la coupe

J'ai une ligne de sortie d'une commande comme celle-ci:

[]$ <command> | grep "Memory Limit"
Memory Limit:           12345 KB

J'essaie de retirer le 12345. La première étape - la séparation par le colon - fonctionne bien

[]$ <command> | grep "Memory Limit" | cut -d ':' -f2
           12345 KB

Essayer de séparer cela est ce qui est délicat. Comment puis-je rogner les espaces afin que cut -d ' ' -f1 renvoie "12345" plutôt qu'un blanc?

13
user2824889

Dirigez votre commande vers awk, imprimez la 3ème colonne, un espace et la 4ème colonne comme ceci

<command> | awk '{print $3, $4}'

Il en résulte:

12345 KB

ou

<command> | awk '{print $3}'

si vous voulez le nombre nu.

12
John Goofy

tr aide ici.

$ echo "Memory Limit:           12345 KB" | tr -s " " | cut -d " " -f3
12345
  • tr -s " " - comprime tous les espaces en un
  • cut -d " " -f3 - divisé en colonnes par espace et sélectionnez le troisième
6
anatoly techtonik

Vous pouvez utiliser awk et éviter d'utiliser toute coupe, sed ou regex:

<command> | awk '/Memory Limit/{print $(NF-1)}'

12345
  • /Memory Limit/ Fera de cette impression uniquement une ligne avec du texte Memory Limit
  • $(NF-1) vous obtiendrez last-1 e champ en entrée.
5
anubhava

devez-vous utiliser cut? cut est uniquement destiné à l'extraction d'un délimiteur à caractère unique. Je ne pense pas que la coupe puisse être aussi simple que vous le pensez.

sed est simple:

$ echo "Memory Limit:           12345 KB" | sed 's/.*:\s*//'
12345 KB

explication:

.*:\s* correspond à toutes les lettres avant le dernier deux-points, puis correspond à tous les caractères vides après cela et les supprime en les remplaçant par une chaîne vide.


il s'avère que vous vous attendiez à un seul numéro. alors je dirais juste aller de l'avant et faire correspondre les chiffres:

$ echo "Memory Limit:           12345 KB" | grep -o -P '\d+'
12345
2
Jason Hu

bash possède également une correspondance d'expressions régulières que vous pouvez utiliser.

result=$(<command> | grep "Memory Limit")
regex='Memory Limit:[[:space:]]+([[:digit:]]+)[[:space:]]KB'
if [[ $result =~ $regex ]]; then
  result=${BASH_REMATCH[0]}
else
  # deal with an unexpected result here
fi

La valeur de $regex peut être ajusté si nécessaire.

1
chepner

awk est peut-être le meilleur pour cette tâche, mais voici une manière peu orthodoxe

$ grep -oP "(?<=Memory Limit:)\s+[0-9]+" file | xargs

regarder derrière pour faire correspondre l'étiquette et sortir uniquement la correspondance, utilisez xargs pour manger des espaces

0
karakfa