$ 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]} cucumbersLe
var=()déclare un tableau,$(command)enregistre la sortie de la commande. Donc,foo=( $(SayStuff) )stocke la sortie deSayStuffdans le tableaufooet toi alorsechoc'est le troisième élément avec${foo[2]}. -
sed$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbersLe
sedla 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##* } cucumbersCela 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]' cucumberLe
-afaitperlse comporte commeawk, divisant les lignes au niveau des espaces et enregistrant dans le tableau@F. Nous imprimons ensuite le dernier élément de@F($#Fest le nombre d'éléments dans@F). Le-ldit à perl d'ajouter une nouvelle ligne à chaqueprintdéclaration, le-nqu'il doit traiter STDIN ligne par ligne et-equ'il doit exécuter le script donné à la ligne de commande.$ SayStuff | perl -pe 's/.* //' cucumberLes options ont été expliquées ci-dessus, nous supprimons simplement tout jusqu'au dernier espace et imprimons (
-p).$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbersIci nous passons
Watermelons and cucumberscomme arguments, que perl enregistrera dans le@ARGtableau et ainsi, nous imprimons le dernier élément de@ARG. -
tromperie. Celui-ci utilise
sedpour convertir les espaces en nouvelles lignes puistailpour n'imprimer que la dernière ligne.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers -
grep et expressions régulières, en utilisant
-oqui 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.