$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Le -d ' '
dit cut
diviser sur les espaces. -f 3
sélectionne la troisième colonne.
Vous pouvez également utiliser awk
, qui effectue déjà le fractionnement en fonction de l'espace et rend les colonnes disponibles en tant que $1
, $2
, …
$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
J'utiliserais probablement l'une des options déjà proposées par @slhck, mais voici quelques autres façons de procéder :
-
Utiliser des tableaux, comme vous le feriez dans n'importe quel autre langage :
$ foo=( $(SayStuff) ) $ echo ${foo[2]} cucumbers
Le
var=()
déclare un tableau,$(command)
enregistre la sortie de la commande. Donc,foo=( $(SayStuff) )
stocke la sortie deSayStuff
dans le tableaufoo
et toi alorsecho
c'est le troisième élément avec${foo[2]}
. -
sed
$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbers
Le
sed
la commande remplacera (s///
) tout avec le dernier mot. L'expression régulière correspond à n'importe quoi jusqu'à un espace (.*
) qui correspondra à tout jusqu'au dernier espace puis capture le dernier mot(\(.*\)
. Puisque le mot a été capturé, nous pouvons nous y référer comme\1
.Une version simplifiée :
$ SayStuff | sed 's/.* //' cucumbers
-
frapper
$ foo=$(SayStuff); echo ${foo##* } cucumbers
Cela utilise les capacités de manipulation de chaînes de bash, voir ici pour plus de détails.
-
Plus de bas
$ SayStuff | while read a b c; do echo $c; done cucumbers
-
Perl, où bien sûr, il y a plusieurs façons de le faire :
$ SayStuff | perl -lane 'print $F[$#F]' cucumber
Le
-a
faitperl
se comporte commeawk
, divisant les lignes au niveau des espaces et enregistrant 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
déclaration, le-n
qu'il doit traiter STDIN ligne par ligne et-e
qu'il doit exécuter le script donné à la ligne de commande.$ SayStuff | perl -pe 's/.* //' cucumber
Les options ont été expliquées ci-dessus, nous supprimons simplement tout jusqu'au dernier espace et imprimons (
-p
).$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbers
Ici nous passons
Watermelons and cucumbers
comme arguments, que perl enregistrera dans le@ARG
tableau et ainsi, nous imprimons le dernier élément de@ARG
. -
tromperie. Celui-ci utilise
sed
pour convertir les espaces en nouvelles lignes puistail
pour n'imprimer que la dernière ligne.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers
-
grep et expressions régulières, en utilisant
-o
qui imprime uniquement la chaîne correspondante.$ SayStuff | grep -Po '\w+$' cucumbers
-
tricherie
$ SayStuff | grep -o cucumbers cucumbers
Voici quelques explications supplémentaires :
Usage: cut OPTION... [FILE]...
Print selected parts of lines from each FILE to standard output.
-d, --delimiter=DELIM
use DELIM instead of TAB for field delimiter
-f, --fields=LIST
select only these fields; also print any line that contains no
delimiter character, unless the -s option is specified
Donc si vous avez besoin du 3ème champ et qu'il est délimité par des espaces ' ' alors c'est le cas
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Si vous voulez le DERNIER champ, vous devriez probablement utiliser awk .
Dans ce cas, cela devient :
$ echo "Pastèques et concombres" | awk '{ print $NF }'
concombres
En awk
NF est le nombre de champs dans la ligne donc $NF
signifie le dernier champ de la ligne.