Jeśli mam naprawdę długi wynik polecenia (pojedynczy wiersz), ale wiem, że chcę tylko pierwszych [x] (powiedzmy 8) znaków wyjścia, jaki jest najłatwiejszy sposób na uzyskanie tego? Nie ma żadnych ograniczników.
Jeśli mam naprawdę długi wynik polecenia (pojedynczy wiersz), ale wiem, że chcę tylko pierwszych [x] (powiedzmy 8) znaków wyjścia, jaki jest najłatwiejszy sposób na uzyskanie tego? Nie ma żadnych ograniczników.
Odpowiedzi:
Jednym ze sposobów jest użycie cut
:
command | cut -c1-8
To da ci pierwsze 8 znaków każdego wiersza wyniku. Ponieważ cut
jest częścią POSIX, prawdopodobnie znajdzie się na większości Unices.
cut -c
wybiera znaki; cut -b
lub head -c
wybiera bajty. To robi różnicę w niektórych lokalizacjach (w praktyce, gdy używasz UTF-8).
cut -c-8
wybierze postać od 1 do 8.
cut
odpowiednikiem w systemie Windows jest?
command | dd bs=8 count=1 2>/dev/null
. Nie mówiąc, że jest krótszy lub lepszy. Po prostu kolejna alternatywa.
cut
, cut -c
działa jak cut -b
(to znaczy, że nie działa prawidłowo dla znaków wielo-bajtowych).
Są to inne sposoby na uzyskanie tylko pierwszych 8 znaków.
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
A jeśli masz bash
var=$(command)
echo ${var:0:8}
command | sed 's/\(.\{8\}\).*/\1/'
czy jeśli sed wspiera go: command | sed -r 's/(.{8}).*/\1/'
; W przeciwnym razie +1
head -c
liczy się bajty , a nie znaki. Podobnie, wśród głównych implementacji Awk, tylko awk GNU obsługuje poprawnie znaki wielobajtowe - Awk FreeBSD i Mawk nie.
Jeśli masz dostatecznie zaawansowaną powłokę (na przykład następujące polecenia będą działać w Bash, nie masz pewności co do myślnika), możesz:
read -n8 -d$'\0' -r <(command)
Po wykonaniu read ... <(command)
twoje postacie będą w zmiennej powłoki REPLY
. Wpisz, help read
aby dowiedzieć się o innych opcjach.
Objaśnienie: -n8
argument read
mówi, że chcemy mieć do 8 znaków. -d$'\0'
Mówi czytać aż null, zamiast do nowej linii. W ten sposób odczyt będzie kontynuowany przez 8 znaków, nawet jeśli jeden z wcześniejszych znaków jest znakiem nowej linii (ale nie, jeśli jest pusty). Alternatywą -n8 -d$'\0'
jest użycie -N8
, która odczytuje dokładnie 8 znaków lub dopóki standardowe wejście nie osiągnie EOF. Żaden ogranicznik nie jest honorowany. To prawdopodobnie lepiej pasuje do twoich potrzeb, ale nie wiem od razu, ile skorup ma odczyt, który honoruje, -N
a nie honoruje -n
i -d
. Kontynuując wyjaśnienie: -r
mówi ignoruj \
-scapes, tak że na przykład traktujemy \\
jak dwie postacie, a nie pojedyncze \
.
Wreszcie robimy to read ... <(command)
raczej niż command | read ...
dlatego, że w drugiej formie odczyt jest wykonywany w podpowłoce, która jest następnie natychmiast zamykana, tracąc właśnie przeczytane informacje.
Inną opcją jest wykonanie całego przetwarzania w podpowłoce. Na przykład:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
cut
.
read -n <num>
; małe zastrzeżenie: Bash 3.x (wciąż obecny na OS) błędnie interpretuje <num>
jako bajt liczby, a tym samym nie ze znaków wielo-bajtowych; zostało to naprawione w Bash 4.x.
Kolejne rozwiązanie liniowe z wykorzystaniem rozszerzenia parametrów
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
x=8; echo ${word:0:$x}
zamiast zakodować liczbę całkowitą.
To jest przenośne:
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
Zbudować ciąg znaków o zmiennej długości ma tutaj swoje własne pytanie .
Miałem ten problem podczas ręcznego generowania plików sum kontrolnych w repozytorium maven. Niestety cut -c
zawsze drukuje nowy wiersz na końcu wydruku. Aby stłumić to, którego używam xxd
:
command | xxd -l$BYTES | xxd -r
Wyprowadza dokładnie $BYTES
bajty, chyba że command
wynik jest krótszy, to dokładnie to wyjście.
cut
| tr -d '\n'