Polecenie Linux, aby pobrać zakres bajtów z pliku

15

Wiem o tym headi tailmogę wybrać -copcję określenia przesunięcia bajtów. Szukam sposobu wydajnego wyodrębnienia zakresu bajtów z dużego pliku dziennika.

Ramon
źródło

Odpowiedzi:

17

DareDevil z komend Uniksa, ddna ratunek!

dd if=yourfile ibs=1 skip=200 count=100

To zaczyna się od bajtu 200 i pokazuje 100 kolejnych bajtów, czyli innymi słowy bajty 200-300. ibsoznacza, że ​​dd odczytuje tylko jeden bajt naraz zamiast domyślnych 512 bajtów, ale nadal zapisuje w domyślnych porcjach 512-bajtowych. Idź i zobacz, czy to ibsszkodzi wydajności, mam nadzieję, że nie.

Janne Pikkarainen
źródło
W przypadku pliku 782090815 bajtów otrzymałem te czasy: time dd if=file.txt | wc -l= 00: 00: 03s. time dd if=file.txt ibs=1 count=782090815 | wc -l= 9:05:19
Danilo Souza Morães
11

Jeśli twoje zainteresowanie jest w bajtach, byłoby odbardziej interesujące.

-j, --skip-bytes=bytes
-N, --read-bytes=bytes

Tak więc, aby odczytać 16 bajtów zaczynających się od bajtu 1024 i wyprowadzić w ascii

od -j 1024 -N 16 -a /bin/sh
Sirch
źródło
4

Możesz użyć dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks(być może z, bs=1aby uzyskać bloki jednobajtowe, w przeciwnym razie używa bloków 512-bajtowych). Nie jestem jednak pewien, jak efektywnie jest mówić po jednym bajcie na raz.

DerfK
źródło
Cóż, jeśli chodzi o wydajność - 2 ddmożna łączyć ze sobą rurami (1. może przeciąć kawałek tłuszczu, a 2. wykona świetną robotę nad rurą, a nie dyskiem), ale ddma nie tylko bsoddzielne ibsi obsrównież, więc na przynajmniej mógłby generować z większymi blokami niż czytanie.
poige
1

Zakładając, że plik nie jest zbyt duży (np. Kilka GB lub więcej), przesyłanie strumieniowe z jednego do drugiego jest tak wydajne, jak to tylko możliwe, bez pisania własnego programu, aby to zrobić.

head ... file | tail ...

(Lub na odwrót. Cokolwiek.)

Ignacio Vazquez-Abrams
źródło
1
ogon powinien iść pierwszy w przypadku dużych odsunięć, w przeciwnym razie początek głowy jest odrzucany.
proski