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?
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.
tr aide ici.
$ echo "Memory Limit: 12345 KB" | tr -s " " | cut -d " " -f3
12345
tr -s " "
- comprime tous les espaces en uncut -d " " -f3
- divisé en colonnes par espace et sélectionnez le troisièmeVous 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.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
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.
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