Yanıtlar:
Eski okul - şunları kullanabilirsiniz dd:
dd if=A_FILE bs=1 skip=3
Giriş dosyası, A_FILEblok boyutu 1 karakterdir (bayt), ilk 3 'bloğu' (bayt) atlar. ( ddGNU gibi bazı varyantlarında, burada ddkullanabilirsiniz bs=1c- ve bs=1kdiğer durumlarda 1 kilobaytlık bloklar halinde okumak gibi alternatifler . ddAIX'te bunu desteklemiyor gibi görünüyor; BSD (macOS Sierra) varyantı desteklemiyor cama does destek k, m, gvs.)
Aynı sonucu elde etmenin başka yolları da vardır:
sed '1s/^...//' A_FILE
İlk satırda 3 veya daha fazla karakter varsa bu işe yarar.
tail -c +4 A_FILE
Ve Perl, Python ve benzerlerini de kullanabilirsiniz.
Kullanmak yerine catşu şekilde kullanabilirsiniz tail:
tail -c +4 FILE
Bu, ilk 3 bayt dışında tüm dosyayı yazdırır. man tailDaha fazla bilgi için danışın .
/usr/xpg4/bin/tailen azından makinemde kullanmalısın . Yine de iyi ipucu!
Son zamanlarda benzer bir şey yapmam gerekiyordu. Bir saha destek sorununa yardımcı oluyordum ve bir teknisyenin değişiklik yaparken gerçek zamanlı grafikleri görmesine izin vermeliydim. Veriler, gün boyunca büyüyen ikili bir günlüktedir. Günlüklerden verileri ayrıştırabilen ve çizebilen yazılımım var, ancak şu anda gerçek zamanlı değil. Yaptığım şey, verileri işlemeye başlamadan önce günlüğün boyutunu yakalamaktı, daha sonra verileri işleyecek bir döngüye girdi ve her geçiş henüz işlenmemiş olan dosyanın baytlarıyla yeni bir dosya oluşturdu.
#!/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; stat -c'%s' "${IFILE}"bu ls|awkkombo yerine kullanmayı düşündün mü? Yani, GNU coreutils
Sisteminde Python varsa seek(), nth baytında okumaya başlamak için fonksiyondan yararlanmak için küçük python betiği kullanılabilir :
#!/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())
Ve kullanım şöyle olurdu:
$ ./skip_bytes.py input.txt 3
Bayt sayısının 0'da başladığını unutmayın (bu nedenle ilk bayt aslında dizin 0'dır), bu nedenle 3'ü belirterek okumayı 3 + 1 = 4. baytta başlayacak şekilde etkili bir şekilde konumlandırıyoruz.
dd if=A_FILE bs=1 skip=3, AIX 6.1'de olmalıdır