Dis que j'exécute la commande SayStuff
$ SayStuff
et la sortie est
Watermelons and cucumbers
Maintenant. Disons que je veux extraire la sous-chaîne cucumbers
de la sortie et la diriger vers quelque chose.
La façon dont je procéderais par programme serait de diviser la sortie en un tableau par le délimiteur Space et de le référencer par ArrayName[2]
. Je suis assez nouveau dans les scripts shell et je n'ai réussi qu'à trouver des cut
exemples semi-cryptiques , dont aucun n'avait de sens.
Des idées?
linux
command-line
bash
krystah
la source
la source
cut
ne gérera pas un nombre variable d'espaces, alors queawk
faire.J'utiliserais probablement l'une des options déjà données par @slhck mais voici quelques autres façons de le faire:
Utilisation de tableaux, comme vous le feriez dans n'importe quelle autre langue:
Le
var=()
déclare un tableau,$(command)
enregistre la sortie de la commande. Donc,foo=( $(SayStuff) )
stocke la sortie deSayStuff
dans le tableaufoo
et yuou alorsecho
c'est le troisième élément avec${foo[2]}
.sed
La
sed
commande remplacera (s///
) tout par le dernier mot. Le regex correspond à tout jusqu'à un espace (.*
) qui correspondra à tout jusqu'au dernier espace, puis capture le dernier mot(\(.*\)
. Puisque le mot a été capturé, nous pouvons l'appeler\1
.Une version plus simple:
frapper
Cela utilise les capacités de manipulation de chaînes de bash, voir ici pour plus de détails.
Plus bash
Perl, où bien sûr, il existe de nombreuses façons de le faire:
Les
-a
marquesperl
se comportent comme si ellesawk
divisaient les lignes dans les espaces et les enregistraient dans le tableau@F
. Nous imprimons ensuite le dernier élément de@F
($#F
est le nombre d'éléments dans@F
). Le-l
dit à perl d'ajouter une nouvelle ligne à chaqueprint
instruction, le-n
fait qu'il doit traiter STDIN ligne par ligne et-e
qu'il doit exécuter le script donné sur la ligne de commande.Les options ont été expliquées ci-dessus, nous supprimons simplement tout jusqu'au dernier espace et imprimons (
-p
).Ici , nous passons
Watermelons and cucumbers
comme arguments qui perl économiseront dans le@ARG
tableau et, nous imprimer le dernier élément de@ARG
.tromperie. Celui-ci utilise
sed
pour convertir les espaces en retours à la ligne, puistail
pour imprimer uniquement la dernière ligne.grep et expressions régulières,
-o
qui n'impriment que la chaîne correspondante.La triche
la source
Voici quelques explications supplémentaires:
Donc, si vous avez besoin du 3e champ et qu'il est délimité par des espaces '', il est
Si vous voulez que le DERNIER champ , vous devriez probablement utiliser awk .
Dans ce cas, cela devient:
Dans
awk
NF est le nombre de champs de la ligne, donc$NF
le dernier champ de la ligne.la source