Câu trả lời:
Trường học cũ - bạn có thể sử dụng dd
:
dd if=A_FILE bs=1 skip=3
Tệp đầu vào là A_FILE
, kích thước khối là 1 ký tự (byte), bỏ qua 3 'khối' (byte) đầu tiên. (Với một số biến thể dd
như GNU dd
, bạn có thể sử dụng bs=1c
ở đây - và các lựa chọn thay thế như bs=1k
đọc trong các khối 1 kilobyte trong các trường hợp khác. Có dd
vẻ như AIX không hỗ trợ điều này c
nhưng không hỗ trợ k
, m
, g
, vv)
Cũng có những cách khác để đạt được kết quả tương tự:
sed '1s/^...//' A_FILE
Điều này hoạt động nếu có 3 ký tự trở lên trên dòng đầu tiên.
tail -c +4 A_FILE
Và bạn có thể sử dụng Perl, Python và như vậy.
Thay vì sử dụng, cat
bạn có thể sử dụng tail
như vậy:
tail -c +4 FILE
Điều này sẽ in ra toàn bộ tập tin ngoại trừ 3 byte đầu tiên. Tư vấn man tail
để biết thêm thông tin.
/usr/xpg4/bin/tail
, ít nhất là trên máy của tôi. Mẹo tốt dù sao!
Tôi cần phải làm gần đây một cái gì đó tương tự. Tôi đã giúp đỡ với một vấn đề hỗ trợ tại hiện trường và cần phải cho một kỹ thuật viên xem các lô thời gian thực khi họ đang thực hiện các thay đổi. Dữ liệu nằm trong nhật ký nhị phân phát triển suốt cả ngày. Tôi có phần mềm có thể phân tích cú pháp và vẽ dữ liệu từ nhật ký, nhưng hiện tại nó không phải là thời gian thực. Những gì tôi đã làm là nắm bắt kích thước của nhật ký trước khi tôi bắt đầu xử lý dữ liệu, sau đó đi vào một vòng lặp sẽ xử lý dữ liệu và mỗi lần tạo một tệp mới với các byte của tệp chưa được xử lý.
#!/usr/bin/env bash
# I named this little script hackjob.sh
# The purpose of this is to process an input file and load the results into
# a database. The file is constantly being update, so this runs in a loop
# and every pass it creates a new temp file with bytes that have not yet been
# processed. It runs about 15 seconds behind real time so it's
# pseudo real time. This will eventually be replaced by a real time
# queue based version, but this does work and surprisingly well actually.
set -x
# Current data in YYYYMMDD fomat
DATE=`date +%Y%m%d`
INPUT_PATH=/path/to/my/data
IFILE1=${INPUT_PATH}/${DATE}_my_input_file.dat
OUTPUT_PATH=/tmp
OFILE1=${OUTPUT_PATH}/${DATE}_my_input_file.dat
# Capture the size of the original file
SIZE1=`ls -l ${IFILE1} | awk '{print $5}'`
# Copy the original file to /tmp
cp ${IFILE1} ${OFILE1}
while :
do
sleep 5
# process_my_data.py ${OFILE1}
rm ${OFILE1}
# Copy IFILE1 to OFILE1 minus skipping the amount of data already processed
dd skip=${SIZE1} bs=1 if=${IFILE1} of=${OFILE1}
# Update the size of the input file
SIZE1=`ls -l ${IFILE1} | awk '{print $5}'`
echo
DATE=`date +%Y%m%d`
done
ls
; Bạn đã cân nhắc sử dụng stat -c'%s' "${IFILE}"
thay vì ls|awk
kết hợp đó chưa? Đó là, giả sử
Nếu một người có Python trên hệ thống của họ, người ta có thể sử dụng tập lệnh python nhỏ để tận dụng seek()
chức năng để bắt đầu đọc ở byte thứ n như vậy:
#!/usr/bin/env python3
import sys
with open(sys.argv[1],'rb') as fd:
fd.seek(int(sys.argv[2]))
for line in fd:
print(line.decode().strip())
Và việc sử dụng sẽ như vậy:
$ ./skip_bytes.py input.txt 3
Lưu ý rằng số byte bắt đầu từ 0 (do đó byte đầu tiên thực sự là chỉ số 0), do đó bằng cách chỉ định 3 chúng tôi định vị hiệu quả việc đọc để bắt đầu ở 3 + 1 = byte thứ 4
dd if=A_FILE bs=1 skip=3
ở AIX 6.1