Jawaban:
Sekolah lama - Anda bisa menggunakan dd
:
dd if=A_FILE bs=1 skip=3
File inputnya adalah A_FILE
, ukuran blok adalah 1 karakter (byte), lewati 3 'blok' pertama (byte). (Dengan beberapa varian dd
seperti GNU dd
, Anda dapat menggunakan di bs=1c
sini - dan alternatif suka bs=1k
membaca dalam blok 1 kilobyte dalam keadaan lain. dd
Tampaknya pada AIX tidak mendukung ini, tampaknya; varian BSD (macOS Sierra) tidak mendukung c
tetapi tidak mendukung k
, m
, g
, dll)
Ada cara lain untuk mencapai hasil yang sama juga:
sed '1s/^...//' A_FILE
Ini berfungsi jika ada 3 karakter atau lebih di baris pertama.
tail -c +4 A_FILE
Dan Anda bisa menggunakan Perl, Python dan sebagainya juga.
Alih-alih menggunakan cat
Anda dapat menggunakan tail
seperti itu:
tail -c +4 FILE
Ini akan mencetak seluruh file kecuali untuk 3 byte pertama. Konsultasikan man tail
untuk informasi lebih lanjut.
/usr/xpg4/bin/tail
, setidaknya di komputer saya. Meskipun begitu, tip yang bagus!
Saya perlu melakukan sesuatu yang serupa baru-baru ini. Saya membantu dengan masalah dukungan lapangan dan perlu membiarkan teknisi melihat plot waktu nyata saat mereka melakukan perubahan. Data dalam log biner yang tumbuh sepanjang hari. Saya memiliki perangkat lunak yang dapat menguraikan dan memplot data dari log, tetapi saat ini tidak real time. Apa yang saya lakukan adalah menangkap ukuran log sebelum saya mulai memproses data, kemudian masuk ke loop yang akan memproses data dan setiap pass membuat file baru dengan byte file yang belum diproses.
#!/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
; sudahkah Anda mempertimbangkan untuk menggunakan stat -c'%s' "${IFILE}"
bukannya ls|awk
kombo itu? Yaitu, dengan asumsi GNU coreutils ...
Jika seseorang memiliki Python di sistem mereka, seseorang dapat menggunakan skrip python kecil untuk memanfaatkan seek()
fungsi untuk mulai membaca pada byte ke-n seperti ini:
#!/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())
Dan penggunaannya akan seperti ini:
$ ./skip_bytes.py input.txt 3
Perhatikan bahwa jumlah byte dimulai pada 0 (dengan demikian byte pertama sebenarnya indeks 0), sehingga dengan menentukan 3 kita secara efektif memposisikan pembacaan dimulai pada 3 + 1 = byte 4
dd if=A_FILE bs=1 skip=3
dalam AIX 6.1