$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
-d ' '
říká cut
rozdělit na prostory. -f 3
vybere třetí sloupec.
Můžete také použít awk
, který již provádí rozdělení na základě prostoru a zpřístupňuje sloupce jako $1
, $2
, …
$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
Pravděpodobně bych použil jednu z možností již poskytnutých @slhck, ale zde je několik dalších způsobů, jak to udělat:
-
Použití polí jako v jakémkoli jiném jazyce:
$ foo=( $(SayStuff) ) $ echo ${foo[2]} cucumbers
var=()
deklaruje pole,$(command)
uloží výstup příkazu. Takžefoo=( $(SayStuff) )
ukládá výstupSayStuff
do polefoo
a vy pakecho
je to třetí prvek s${foo[2]}
. -
sed
$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbers
sed
příkaz nahradí (s///
) vše s posledním slovem. Regulární výraz odpovídá čemukoli až do mezery (.*
), který bude odpovídat všemu až do poslední mezery a poté zachytí poslední slovo(\(.*\)
. Protože slovo bylo zachyceno, můžeme jej označit jako\1
.Jednodušší verze:
$ SayStuff | sed 's/.* //' cucumbers
-
bash
$ foo=$(SayStuff); echo ${foo##* } cucumbers
To využívá schopnosti manipulace se řetězci bash, další podrobnosti naleznete zde.
-
Více bash
$ SayStuff | while read a b c; do echo $c; done cucumbers
-
Perl, kde samozřejmě existuje mnoho způsobů, jak to udělat:
$ SayStuff | perl -lane 'print $F[$#F]' cucumber
-a
děláperl
chovat se jakoawk
, rozdělení řádků na prázdné místo a uložení do pole@F
. Potom vytiskneme poslední prvek@F
($#F
je počet prvků v@F
).-l
řekne perlu, aby ke každémuprint
přidal nový řádek-n
že by měl zpracovat STDIN řádek po řádku a-e
že by měl spustit skript uvedený na příkazovém řádku.$ SayStuff | perl -pe 's/.* //' cucumber
Možnosti byly vysvětleny výše, pouze mažeme vše do posledního místa a tiskneme (
-p
).$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbers
Zde předáváme
Watermelons and cucumbers
jako argumenty, které perl uloží do@ARG
pole a tak vytiskneme poslední prvek@ARG
. -
podvod. Tento používá
sed
pro převod mezer na nové řádky a potétail
vytisknout pouze poslední řádek.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers
-
grep a regulární výrazy pomocí
-o
který vytiskne pouze odpovídající řetězec.$ SayStuff | grep -Po '\w+$' cucumbers
-
podvádění
$ SayStuff | grep -o cucumbers cucumbers
Zde je další vysvětlení:
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
Pokud tedy potřebujete 3. pole a je odděleno mezerami ' ', pak je
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Pokud chcete POSLEDNÍ pravděpodobně byste měli použít awk .
V tomto případě to bude:
$ echo "Melouny a okurky" | awk '{ print $NF }'
okurky
V awk
NF je počet polí v řádku, takže $NF
znamená poslední pole v řádku.