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 headdo tego jest to, że składnia taildopasowań:
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 headi użyj tail, aby uzyskać ostatnie 100:
head -c 200 file | tail -c 100
head, a następnie użyj, tailaby 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=1wymusza na dd odczytywanie i zapisywanie pojedynczego znaku na raz, co jest znacznie wolniejsze niż headwtedy, gdy liczba jest duża. Nie jest to jednak zauważalne, gdy count = 5.
ddwygląda na to, że załatwi sprawę… Na zdrowie!
head -cdd 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 -1sł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 -ci tr/ sedz 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 headprzeciwko 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 cuti trna 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 cutnie radzisz sobie -cpoprawnie z kodowaniem ze zmiennymi bajtami, dla „pierwszych Xznaków” (zamień na Xswó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ążliwesedskrypt 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ś takiegoddJeśli twój trnie 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 1po prostu zwraca bełkot ... zachowuje się jak 'głowa'
Oto prosty skrypt, który kończy się przy użyciu ddwspomnianego 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.fiforównież konsumuje," world\n"co jest stracone na zawsze.