Czy istnieje polecenie jak cat
w Linuksie, które może zwrócić określoną ilość znaków z pliku?
np. mam plik tekstowy taki jak:
Hello world
this is the second line
this is the third line
I chcę czegoś, co zwróci pierwsze 5 znaków, czyli „cześć”.
dzięki
linux
command-line
pbreault
źródło
źródło
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
również konsumuje," world\n"
co jest stracone na zawsze.Odpowiedzi:
head
działa też:..wyodrębni pierwsze 100 bajtów i zwróci je.
Przyjemne w użyciu
head
do tego jest to, że składniatail
dopasowań:Możesz je łączyć, aby uzyskać zakresy bajtów. Na przykład, aby pobrać drugie 100 bajtów z pliku, przeczytaj pierwsze 200
head
i użyj tail, aby uzyskać ostatnie 100:źródło
head
, a następnie użyj,tail
aby uzyskać ostatnie 10, np .:head -c 20 file | tail -c 10
Możesz użyć dd do wyodrębnienia dowolnych fragmentów bajtów.
Na przykład,
skopiowałby bajty od 1235 do 1239 ze swojego wejścia na wyjście, a resztę odrzucił.
Aby po prostu pobrać pierwsze pięć bajtów ze standardowego wejścia, wykonaj:
Zauważ, że jeśli chcesz określić nazwę pliku wejściowego, dd ma przestarzałe analizowanie argumentów, więc możesz zrobić:
Zauważ również, że dd werbalnie ogłasza, co zrobił, więc aby to odrzucić, wykonaj:
lub
źródło
dd bs=1
wymusza na dd odczytywanie i zapisywanie pojedynczego znaku na raz, co jest znacznie wolniejsze niżhead
wtedy, gdy liczba jest duża. Nie jest to jednak zauważalne, gdy count = 5.dd
wygląda na to, że załatwi sprawę… Na zdrowie!head -c
dd bs=5 count=1
głowa :
Imię
head - wypisuje pierwszą część plików
Streszczenie
head [ OPCJA ] ... [ PLIK ] ...
Opis
Wydrukuj pierwsze 10 wierszy każdego PLIKU na standardowe wyjście. W przypadku więcej niż jednego PLIKU należy poprzedzić każdy nagłówkiem podającym nazwę pliku. Bez PLIKU lub gdy PLIK ma wartość -, czyta standardowe wejście.
Obowiązkowe argumenty dla długich opcji są również obowiązkowe dla krótkich opcji.
-c , --bytes = [-] N wypisuje pierwsze N bajtów każdego pliku; z początkowym „-” wypisuje wszystkie oprócz ostatnich N bajtów każdego pliku
źródło
głowa lub ogon również może to zrobić:
Drukuje pierwsze X bajtów (niekoniecznie znaków, jeśli jest to plik UTF-16) pliku. tail zrobi to samo, z wyjątkiem ostatnich X bajtów.
To (i cięcie) są przenośne.
źródło
ten skrypt podaje dokładną liczbę znaków z określonej linii i lokalizacji, np .:
nadaje znaki w linii 5 i znaki 5 do 8 w linii 5,
Uwaga :
tail -1
służy do wyboru ostatniej linii wyświetlanej przez głowę.źródło
możesz też wyrównać linię, a następnie wyciąć ją jak na przykład:
grep nazwa pliku 'text' | cięcie -c 1-5
źródło
Wiem, że odpowiedź jest odpowiedzią na pytanie zadane 6 lat temu ...
Ale szukałem czegoś podobnego przez kilka godzin, a potem odkryłem, że: cut -c robi dokładnie to, z dodatkową premią, którą można również określić przesunięcie.
cut -c 1-5 powróci Witaj, a cut -c 7-11 powrócą do świata . Nie potrzeba żadnego innego polecenia
źródło
Chociaż odpowiedź na to pytanie została udzielona / zaakceptowana lata temu, obecnie akceptowana odpowiedź jest poprawna tylko dla kodowania jednobajtowego na znak, takiego jak iso-8859-1, lub dla jednobajtowych podzbiorów zestawów znaków o zmiennej bajtach (takich jak znaki łacińskie w ramach UTF-8). Nawet użycie wielobajtowych połączeń zamiast tego nadal działałoby tylko w przypadku stałych wielobajtowych kodowań, takich jak UTF-16. Biorąc pod uwagę, że obecnie UTF-8 jest na dobrej drodze, aby stać się uniwersalnym standardem, i patrząc na tę listę języków według liczby rodzimych użytkowników języka i listę 30 najpopularniejszych języków według użycia rodzimego / wtórnego , należy zwrócić uwagę na prosta technika przyjazna dla znaków (nie oparta na bajtach) ze zmiennymi bajtami, wykorzystująca
cut -c
itr
/sed
z klasami znaków.Porównaj następujące, które podwójnie zawodzą z powodu dwóch typowych błędów / przypuszczeń związanych z alfabetem łacińskim dotyczących kwestii bajtów i znaków (jeden jest
head
przeciwkocut
, drugi jest[a-z][A-Z]
przeciwko[:upper:][:lower:]
):do tego (uwaga: działało dobrze na FreeBSD, ale w obu
cut
itr
na GNU / Linuksie nadal zniekształcałem grekę w UTF-8):Jeśli
cut
nie radzisz sobie-c
poprawnie z kodowaniem ze zmiennymi bajtami, dla „pierwszychX
znaków” (zamień naX
swój numer) możesz spróbować:sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- co jest ograniczone do pierwszej liniihead -n 1 | grep -E -o '^.{X}'
- który jest ograniczony do pierwszej linii i łączy w łańcuchu dwa poleceniadd
- co zostało już zaproponowane w innych odpowiedziach, ale jest naprawdę uciążliwesed
skrypt z buforem przesuwanego okna do obsługi znaków rozłożonych na wiele linii, ale prawdopodobnie jest to bardziej kłopotliwe / delikatne niż zwykłe użycie czegoś takiegodd
Jeśli twój
tr
nie obsługuje poprawnie klas znaków z kodowaniem bajtów zmiennych, możesz spróbować:sed -E -e 's/[[:upper:]]/\L&/g
(Specyficzne dla GNU)źródło
printf 'Πού ' | cut -c 1
po prostu zwraca bełkot ... zachowuje się jak 'głowa'Oto prosty skrypt, który kończy się przy użyciu
dd
wspomnianego tutaj podejścia:extract_chars.sh
źródło