it-swarm-eu.dev

Získání prvních [x] znaků řetězce z potrubí

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.

67
xenoterracide

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.

95
Steven D

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}
26
user1606

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
2

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>
2
dubiousjim

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 .

1
user79743

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.