Odpowiedzi:
head
działa też:
head -c 100 file # returns the first 100 bytes in the file
..wyodrębni pierwsze 100 bajtów i zwróci je.
Przyjemne w użyciu head
do tego jest to, że składnia tail
dopasowań:
tail -c 100 file # returns the last 100 bytes in the file
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:
head -c 200 file | tail -c 100
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,
dd skip=1234 count=5 bs=1
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:
dd count=5 bs=1
Zauważ, że jeśli chcesz określić nazwę pliku wejściowego, dd ma przestarzałe analizowanie argumentów, więc możesz zrobić:
dd count=5 bs=1 if=filename
Zauważ również, że dd werbalnie ogłasza, co zrobił, więc aby to odrzucić, wykonaj:
dd count=5 bs=1 2>&-
lub
dd count=5 bs=1 2>/dev/null
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 :
head - wypisuje pierwszą część plików
head [ OPCJA ] ... [ PLIK ] ...
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
head -Line_number file_name | tail -1 |cut -c Num_of_chars
ten skrypt podaje dokładną liczbę znaków z określonej linii i lokalizacji, np .:
head -5 tst.txt | tail -1 |cut -c 5-8
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ę.
możesz też wyrównać linię, a następnie wyciąć ją jak na przykład:
grep nazwa pliku 'text' | cięcie -c 1-5
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
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
i tr
/ 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
przeciwko cut
, drugi jest [a-z][A-Z]
przeciwko [:upper:][:lower:]
):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
do tego (uwaga: działało dobrze na FreeBSD, ale w obu cut
i tr
na GNU / Linuksie nadal zniekształcałem grekę w UTF-8):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
W innej, nowszej odpowiedzi zaproponowano już „wycinanie”, ale tylko ze względu na problem uboczny polegający na tym, że można go użyć do określenia dowolnych przesunięć, a nie z powodu bezpośrednio istotnego problemu znak / bajt.
Jeśli cut
nie radzisz sobie -c
poprawnie z kodowaniem ze zmiennymi bajtami, dla „pierwszych X
znaków” (zamień na X
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)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:
#!/usr/bin/env bash
function show_help()
{
IT="
extracts characters X to Y from stdin or FILE
usage: X Y {FILE}
e.g.
2 10 /tmp/it => extract chars 2-10 from /tmp/it
EOF
"
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
FROM=$1
TO=$2
COUNT=`expr $TO - $FROM + 1`
if [ -z "$3" ]
then
dd skip=$FROM count=$COUNT bs=1 2>/dev/null
else
dd skip=$FROM count=$COUNT bs=1 if=$3 2>/dev/null
fi
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.