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.
command-line
shell
text-processing
ksenoterracid
źródło
źródło
Odpowiedzi:
Jednym ze sposobów jest użycie
cut
: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.źródło
cut -c
wybiera znaki;cut -b
lubhead -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 jakcut -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.
A jeśli masz bash
źródło
command | sed 's/\(.\{8\}\).*/\1/'
czy jeśli sed wspiera go:command | sed -r 's/(.{8}).*/\1/'
; W przeciwnym razie +1head -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:
Po wykonaniu
read ... <(command)
twoje postacie będą w zmiennej powłokiREPLY
. Wpisz,help read
aby dowiedzieć się o innych opcjach.Objaśnienie:
-n8
argumentread
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:
źródło
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
źródło
x=8; echo ${word:0:$x}
zamiast zakodować liczbę całkowitą.To jest przenośne:
Zbudować ciąg znaków o zmiennej długości ma tutaj swoje własne pytanie .
źródło
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żywamxxd
:Wyprowadza dokładnie
$BYTES
bajty, chyba żecommand
wynik jest krótszy, to dokładnie to wyjście.źródło
cut
| tr -d '\n'