আমি এআইএক্স 6.1 কেএসএল শেল ব্যবহার করছি।
আমি এই জাতীয় কিছু করতে একটি লাইনার ব্যবহার করতে চাই:
cat A_FILE | skip-first-3-bytes-of-the-file
আমি প্রথম লাইনের প্রথম 3 বাইট ছেড়ে যেতে চাই; এই কাজ করতে একটি উপায় আছে কি?
আমি এআইএক্স 6.1 কেএসএল শেল ব্যবহার করছি।
আমি এই জাতীয় কিছু করতে একটি লাইনার ব্যবহার করতে চাই:
cat A_FILE | skip-first-3-bytes-of-the-file
আমি প্রথম লাইনের প্রথম 3 বাইট ছেড়ে যেতে চাই; এই কাজ করতে একটি উপায় আছে কি?
উত্তর:
পুরাতন স্কুল - আপনি ব্যবহার করতে পারেন dd
:
dd if=A_FILE bs=1 skip=3
ইনপুট ফাইলটি হ'ল A_FILE
, ব্লকের আকার 1 অক্ষর (বাইট), প্রথম 3 'ব্লক' (বাইট) এড়িয়ে যান। (জিএনইউর dd
মতো কিছু বৈকল্পিকের সাহায্যে dd
আপনি bs=1c
এখানে ব্যবহার করতে পারেন - এবং bs=1k
অন্যান্য পরিস্থিতিতে 1 কিলোবাইটের ব্লকগুলির বিকল্পগুলি পড়তে পছন্দ dd
করেন AI c
কিন্তু না সমর্থন k
, m
, g
, ইত্যাদি)
একই ফলাফল অর্জনের অন্যান্য উপায়ও রয়েছে:
sed '1s/^...//' A_FILE
প্রথম লাইনে 3 বা ততোধিক অক্ষর থাকলে এটি কাজ করে।
tail -c +4 A_FILE
এবং আপনি পার্ল, পাইথন এবং আরও অনেক কিছু ব্যবহার করতে পারেন।
পরিবর্তে cat
আপনি tail
যেমন ব্যবহার করতে পারেন :
tail -c +4 FILE
এটি প্রথম 3 বাইট বাদে পুরো ফাইলটি মুদ্রণ করবে। man tail
আরও তথ্যের জন্য পরামর্শ করুন।
/usr/xpg4/bin/tail
, কমপক্ষে আমার মেশিনে। তবুও ভাল টিপ!
আমার সম্প্রতি এমন কিছু করার দরকার ছিল। আমি ফিল্ড সাপোর্ট ইস্যুতে সহায়তা করছিলাম এবং কোনও প্রযুক্তিবিদকে পরিবর্তন করার সময় রিয়েল টাইম প্লটগুলি দেখতে দেওয়া দরকার ছিল। ডেটা বাইনারি লগে থাকে যা সারা দিন ধরে বাড়তে থাকে। আমার কাছে এমন সফ্টওয়্যার রয়েছে যা লগগুলি থেকে ডেটা বিশ্লেষণ এবং প্লট করতে পারে তবে এটি বর্তমানে বাস্তব সময় নয়। আমি ডেটা প্রক্রিয়াকরণ শুরু করার আগে লগের আকারটি ক্যাপচার করেছিলাম, তারপরে একটি লুপে গিয়েছিল যা ডেটা প্রসেস করতে পারে এবং প্রতিটি পাস এখনও ফাইলের বাইটস সহ একটি নতুন ফাইল তৈরি করে যা এখনও প্রক্রিয়া করা হয়নি।
#!/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}"
এই ls|awk
কম্বো পরিবর্তে ব্যবহার বিবেচনা করেছেন ? এটি হ'ল জিএনইউ
যদি কারও সিস্টেমে পাইথন থাকে তবে কেউ seek()
nth বাইটে পড়া শুরু করার জন্য ফাংশনটির সুবিধা নিতে ছোট পাইথন স্ক্রিপ্ট ব্যবহার করতে পারে :
#!/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())
এবং ব্যবহার যেমন হবে:
$ ./skip_bytes.py input.txt 3
নোট করুন যে বাইট গণনা 0 থেকে শুরু হয় (সুতরাং প্রথম বাইটটি আসলে সূচক 0 হয়) সুতরাং 3 নির্দিষ্ট করে আমরা কার্যকরভাবে 3 + 1 = 4 th বাইটে পড়া শুরু করতে পারি
dd if=A_FILE bs=1 skip=3
এআইএক্স 6.1