Nếu bạn muốn bao gồm các dòng X đến Y (bắt đầu đánh số từ 1), hãy sử dụng
tail -n +$X /path/to/file | head -n $((Y-X+1))
tail
sẽ đọc và loại bỏ các dòng X-1 đầu tiên (không có cách nào khác), sau đó đọc và in các dòng sau. head
sẽ đọc và in số dòng yêu cầu, sau đó thoát. Khi head
thoát, tail
nhận tín hiệu SIGPIPE và chết, do đó, nó sẽ không đọc nhiều hơn giá trị của kích thước bộ đệm (thường là vài kilobyte) từ các tệp đầu vào.
Ngoài ra, như gorkypl đề xuất, hãy sử dụng sed:
sed -n -e "$X,$Y p" -e "$Y q" /path/to/file
Tuy nhiên, giải pháp sed chậm hơn đáng kể (ít nhất là đối với các tiện ích GNU và tiện ích Busybox; sed có thể cạnh tranh hơn nếu bạn trích xuất một phần lớn tệp trên HĐH nơi đường ống chậm và sed nhanh). Dưới đây là điểm chuẩn nhanh trong Linux; dữ liệu được tạo bởi seq 100000000 >/tmp/a
, môi trường là Linux / amd64, /tmp
là tmpfs và máy thì không hoạt động và không trao đổi.
real user sys command
0.47 0.32 0.12 </tmp/a tail -n +50000001 | head -n 10 #GNU
0.86 0.64 0.21 </tmp/a tail -n +50000001 | head -n 10 #BusyBox
3.57 3.41 0.14 sed -n -e '50000000,50000010 p' -e '50000010q' /tmp/a #GNU
11.91 11.68 0.14 sed -n -e '50000000,50000010 p' -e '50000010q' /tmp/a #BusyBox
1.04 0.60 0.46 </tmp/a tail -n +50000001 | head -n 40000001 >/dev/null #GNU
7.12 6.58 0.55 </tmp/a tail -n +50000001 | head -n 40000001 >/dev/null #BusyBox
9.95 9.54 0.28 sed -n -e '50000000,90000000 p' -e '90000000q' /tmp/a >/dev/null #GNU
23.76 23.13 0.31 sed -n -e '50000000,90000000 p' -e '90000000q' /tmp/a >/dev/null #BusyBox
Nếu bạn biết phạm vi byte bạn muốn làm việc, bạn có thể trích xuất nó nhanh hơn bằng cách bỏ qua trực tiếp đến vị trí bắt đầu. Nhưng đối với các dòng, bạn phải đọc từ đầu và đếm dòng mới. Để trích xuất các khối từ x bao gồm đến y độc quyền bắt đầu từ 0, với kích thước khối là b:
dd bs=$b seek=$x count=$((y-x)) </path/to/file