Yanıtlar:
Eski okul - şunları kullanabilirsiniz dd
:
dd if=A_FILE bs=1 skip=3
Giriş dosyası, A_FILE
blok boyutu 1 karakterdir (bayt), ilk 3 'bloğu' (bayt) atlar. ( dd
GNU gibi bazı varyantlarında, burada dd
kullanabilirsiniz bs=1c
- ve bs=1k
diğer durumlarda 1 kilobaytlık bloklar halinde okumak gibi alternatifler . dd
AIX'te bunu desteklemiyor gibi görünüyor; BSD (macOS Sierra) varyantı desteklemiyor c
ama does destek k
, m
, g
vs.)
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 tail
Daha fazla bilgi için danışın .
/usr/xpg4/bin/tail
en 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|awk
kombo 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