$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
El -d ' '
le dice a cut
dividir en espacios. -f 3
selecciona la tercera columna.
También puedes usar awk
, que ya realiza la división en función del espacio y hace que las columnas estén disponibles como $1
, $2
, …
$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
Probablemente usaría una de las opciones ya proporcionadas por @slhck, pero aquí hay algunas formas más de hacerlo:
-
Usando matrices, como lo haría en cualquier otro idioma:
$ foo=( $(SayStuff) ) $ echo ${foo[2]} cucumbers
El
var=()
declara una matriz,$(command)
guarda la salida del comando. Entonces,foo=( $(SayStuff) )
almacena la salida deSayStuff
en la matrizfoo
y tú entoncesecho
es el tercer elemento con${foo[2]}
. -
sed
$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbers
El
sed
el comando sustituirá (s///
) todo con la última palabra. La expresión regular coincide con cualquier cosa hasta un espacio (.*
) que hará coincidir todo hasta el último espacio y luego capturará la última palabra(\(.*\)
. Dado que la palabra ha sido capturada, podemos referirnos a ella como\1
.Una versión más simple:
$ SayStuff | sed 's/.* //' cucumbers
-
golpe
$ foo=$(SayStuff); echo ${foo##* } cucumbers
Esto usa las habilidades de manipulación de cadenas de bash, mira aquí para más detalles.
-
Más fiesta
$ SayStuff | while read a b c; do echo $c; done cucumbers
-
Perl, donde, por supuesto, hay muchas formas de hacerlo:
$ SayStuff | perl -lane 'print $F[$#F]' cucumber
El
-a
haceperl
comportarse comoawk
, dividiendo líneas en espacios en blanco y guardando en la matriz@F
. Luego imprimimos el último elemento de@F
($#F
es el número de elementos en@F
). El-l
le dice a perl que agregue una nueva línea a cadaprint
declaración, el-n
que debe procesar STDIN línea por línea y-e
que debe ejecutar el script dado en la línea de comando.$ SayStuff | perl -pe 's/.* //' cucumber
Las opciones se explicaron anteriormente, solo estamos eliminando todo hasta el último espacio e imprimiendo (
-p
).$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbers
Aquí estamos pasando
Watermelons and cucumbers
como argumentos, que perl guardará en el@ARG
matriz y así, imprimimos el último elemento de@ARG
. -
astucia. Este usa
sed
para convertir espacios en saltos de línea y luegotail
para imprimir solo la última línea.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers
-
grep y expresiones regulares, usando
-o
que imprime solo la cadena coincidente.$ SayStuff | grep -Po '\w+$' cucumbers
-
hacer trampa
$ SayStuff | grep -o cucumbers cucumbers
Aquí hay más explicaciones:
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
Entonces, si necesita el tercer campo y está delimitado por espacios ' ', entonces es
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Si quieres el ÚLTIMO campo que probablemente debería usar awk .
En este caso se convierte en:
$ echo "Sandías y pepinos" | awk '{imprimir $NF}'
pepinos
En awk
NF es el número de campos en la línea por lo que $NF
significa el último campo en la línea.