Pokud mám opravdu dlouhý výstup z příkazu (jeden řádek), ale vím, že chci pouze prvních [x] (řekněme 8) znaků výstupu, jaký je nejjednodušší způsob, jak toho dosáhnout? Nejsou žádné oddělovače.
Jedním ze způsobů je použití cut
:
command | cut -c1-8
Tím získáte prvních 8 znaků z každého řádku výstupu. Protože cut
je součástí POSIXu, bude pravděpodobně na většině Unices.
Toto jsou některé další způsoby, jak získat pouze prvních 8 znaků.
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
A pokud máte bash
var=$(command)
echo ${var:0:8}
Další řešení pro liniové použití pomocí rozšíření parametrů
echo ${Word:0:x}
EG: Word="Hello world"
echo ${Word:0:3} or echo ${Word::3}
o/p: Hel
EG.2: Word="Hello world"
echo ${Word:1:3}
o/p: ell
Pokud máte dostatečně pokročilý Shell (například následující bude fungovat v Bashu, ne jistý o pomlčce), můžete udělat:
read -n8 -d$'\0' -r <(command)
Po spuštění read ... <(command)
budou vaše postavy v proměnné Shell REPLY
. Zadejte help read
A získejte další informace.
Vysvětlení: argument -n8
K read
říká, že chceme až 8 znaků. -d$'\0'
Říká, že je přečteno do null, nikoli do nového řádku. Takto bude čtení pokračovat po 8 znaků, i když jeden z předchozích znaků je nový řádek (ale ne pokud je jeho null). Alternativou k -n8 -d$'\0'
Je použití -N8
, Které čte přesně 8 znaků nebo dokud stdin nedosáhne EOF. Žádný oddělovač není poctěn. To pravděpodobně vyhovuje vašim potřebám lépe, ale nevím hned, kolik skořápek má přečtení, které vyznamenává -N
, Na rozdíl od vyznamenání -n
A -d
. Pokračování s vysvětlením: -r
Říká ignorovat \
- unikne, takže například budeme považovat \\
Za dva znaky, spíše než za jeden \
.
Nakonec uděláme read ... <(command)
spíše než command | read ...
, Protože ve druhé podobě je čtení provedeno v subshell, který je pak okamžitě ukončen a ztrácí právě přečtenou informaci.
Další možností je provedení veškerého zpracování uvnitř podshell. Například:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
Toto je přenosné:
a="$(command)" # Get the output of the command.
b="????" # as many ? as characters are needed.
echo ${a%"${a#${b}}"} # select that many chars from $a
Chcete-li vytvořit řetězec s proměnnou délkou znaků má jeho vlastní otázka zde .
Tento problém jsem měl při ručním generování souborů kontrolního součtu v úložišti maven. Bohužel cut -c
vždy vytiskne nový řádek na konci výstupu. Pro potlačení toho, že používám xxd
:
command | xxd -l$BYTES | xxd -r
Výstupy přesně $BYTES
bajtů, pokud není výstup command
kratší, pak přesně tento výstup.