সালিস বাইট গণনা অফসেট থেকে কোনও ফাইল পড়া শুরু করা কি ব্যাশে সম্ভব?


22

আমি এমন একটি তারিখ সন্ধান করতে চাই যা 8 জিবি লগের (পাঠ্য) কোথাও রয়েছে।

আমি কি কিছুটা সম্পূর্ণ ধারাবাহিক পাঠকে বাইপাস করতে পারি এবং প্রথমে ফাইল (আকার) এর বাইনারি স্প্লিটগুলি করতে পারি, বা কোনওরকমভাবে ফাইল সিস্টেমটি inodes(যা সম্পর্কে আমি খুব কম জানি ) নেভিগেট করতে পারি , যতক্ষণ না আমি কোনও উপযুক্ত অফসেট খুঁজে পাই না তারিখটি cotaining করার জন্য আমার পাঠ্য অনুসন্ধানটি কোথায় শুরু করবেন?

tailশেষ লাইনের পড়াটি কোনও সাধারণ ক্রমানুসারে পড়া ব্যবহার করে না, তাই আমি ভাবছি এই সুবিধাটি যদি কোনওভাবে ব্যাশে পাওয়া যায় বা আমার পাইথন বা সি / সি ++ ব্যবহার করা প্রয়োজন তবে আমি একটি bashবিকল্পে বিশেষভাবে আগ্রহী ..


উত্তর:


8
for (( block = 0; block < 16; block += 1 ))
do 
    echo $block; 
    dd if=INPUTFILE skip=$((block*512))MB bs=64 count=1 status=noxfer 2> /dev/null | \
        head -n 1
done

যা .. কোনও টেম্প-বিভক্ত ফাইল তৈরি করে না, প্রতিটি রানে * 512MB ডেটা অবরুদ্ধ করে, সেই অবস্থান থেকে 64 বাইট পড়ে এবং 64৪ বাইটের প্রথম লাইনে আউটপুটকে সীমাবদ্ধ করে।

আপনি যা মনে করেন আপনার প্রয়োজন অনুসারে আপনি 64 টি সামঞ্জস্য করতে চান।


@ ককিরা .. এটি দেখতে বেশ ভাল লাগছে, তবে আমি প্রথমে এটি আরও কিছুটা দেখতে চাই .. (তাই, আগামীকাল অবধি .....
পিটার.ও

1
@কিরা .. 'ডিডি' সুস্বাদু। এটি বাইনারি বিভক্ত অনুসন্ধানের সাথে ভালভাবে কাজ করে ... আমি এখন 1 সেকেন্ডের নীচে বাছাই করা 8 জি ফাইল থেকে একটি রেইজেক্স'ড লাইন বের করতে পারি ... সুতরাং দেখে মনে হচ্ছে আমি আমার 3 টি অর্জন করব দুটি কী (অন্তর্ভুক্ত) এর মধ্যে তারিখের বিস্তৃত পরিমাণ বের করার জন্য দ্বিতীয় ব্যক্তিগত লক্ষ্য .. আউটপুট সময় বাদ দিয়ে, যা আউটপুট হচ্ছে তার উপর নির্ভর করে পরিবর্তিত হয় .. আমিও তার জন্য ব্যবহার করব dd... এটি একটি দুর্দান্ত সরঞ্জাম! :)
পিটার.ও

30

মনে হচ্ছে আপনি চান:

tail -c +1048576

অথবা আপনি যে কোনও বাইট এড়িয়ে যেতে চান। প্লাস চিহ্নটি শেষের পরিবর্তে ফাইলের শুরু থেকে পরিমাপ করতে লেজকে বলে। আপনি যদি লেজের জিএনইউ সংস্করণ ব্যবহার করেন তবে আপনি এটি লিখতে পারেন:

tail -c +1M

কাটার পরে নির্দিষ্ট সংখ্যক বাইট পেতে ফাইলের বাকী সমস্ত ফাইলের পরিবর্তে, কেবল এটি মাথার মাধ্যমে পাইপ করুন:

tail -c +1048576 | head -c 1024

লিনাক্স / ব্যাশের নমনীয়তাটি দুর্দান্ত (আমি অবশ্যই লিনাক্সে স্যুইচ করতে খুব বেশি সময় ব্যয় করেছি)। আমি সবেমাত্র আকিরের উত্তর গ্রহণ করেছি, তবে আমি এটিকে আরও পুরোপুরি মূল্যায়ন না করা পর্যন্ত টেনে নিয়েছি। ddনির্দিষ্ট বাইটে লাফ দেয় (যেমনটি হয় tail), তবে এটি অজানা লাইনের দৈর্ঘ্যের চারপাশে কোডিং হয়ে থাকে এবং তারপরে নেতৃস্থানীয় আংশিক লাইনগুলি কেটে ফেলার আহ্বান জানানো হয় ... এটি লেজের মতো দেখায় head মাথা ব্যথাহীনভাবে করতে পারে (তত দ্রুত?) । আমি বুঝতে পারি না যে কীভাবে মাথাটি ট্যাপটি টেলটি বন্ধ করতে পারে, তবে মনে হয় :) এটি অবশ্যই এর একটি বিষয়: যদি মাথা পাওয়া বন্ধ করে দেয়, লেজ পাঠানো বন্ধ হয়ে যায় (এবং আরও পড়া বন্ধ করে)। যেতে হবে .. আগামীকাল ফিরে।
পিটার.ও

@ ফ্রেড.বিয়ার: tail/ headপাশাপাশি লাইন-দৈর্ঘ্যের অন্ধ অনুমান করতে সক্ষম হয় না। আপনাকে এক্স পজিশনে যেতে হবে এবং তারপরে আপনি পরের জন্য এক্স এর বাম বা ডান দেখতে পারবেন \n। প্রোগ্রামটি কী বলা হয় তা বিবেচ্য নয়। সুতরাং, উভয় ক্ষেত্রেই আপনি এক্সে লাফিয়ে যান এবং তারপরে headলাইনের পরবর্তী প্রান্তের জন্য ডানদিকে তাকান।
আকিরা

tail|headএর গণনা = ভাল সম্পর্কে মোটেও উদ্বিগ্ন না হওয়ার দক্ষতা সরবরাহ করে dd। 'ডিডি' দিয়ে, আমি যদি পর্যাপ্ত ডেটা না ধরি তবে এটি "গেম শেষ" " সালিসি লাইনের দৈর্ঘ্যের নমনীয়তা দুর্দান্ত। আমি 'ডিডি' এর জন্য একটি ফাংশন লিখেছি যা "পরবর্তী নিকটতম" সম্পূর্ণ লাইন এবং এটির অফসেট দেয়, তবে আমি দৈর্ঘ্যের সমস্যাটি এড়াতে পছন্দ করব। আমি এখন লেজ | মাথাটি পরীক্ষা করেছি এবং এটি শুরুতে ভাল সম্পাদন করে (অফসেট = 100MB), তবে অফসেট = 8 জিবিতে এক এক্সেসের জন্য 2 মিনিট নিতে নাটকীয়ভাবে ধীর করে দেয় (আমি awkএটি 1 মিনিটের মধ্যেও করতে পারি) ... সুতরাং এটি দুর্দান্ত ছোট ফাইলটির জন্য .. আমাকে লেজ / মাথা কম্বো সম্পর্কে সচেতন করার জন্য ধন্যবাদ :)
পিটার.ও

2

দ্রুত পার্সিংয়ের জন্য আমি লগটিকে 512MiB খণ্ডে বিভক্ত করার জন্য এই জাতীয় কিছু চেষ্টা করব।

split <filename> -b 536870912

আপনি যদি ফাইলটি সন্ধান করেন তবে নিম্নলিখিতগুলি কাজ করবে:

for file in x* ; do
  echo $file
  head -n 1 $file
done

আপনার তারিখের জন্য কোন ফাইলটি গ্রেপ করতে হবে তা নির্ধারণ করতে সেই আউটপুটটি ব্যবহার করুন।


ধন্যবাদ, তবে এটি ক্রমিক অনুসন্ধানের চেয়ে ধীর। এখানে আমার মন্তব্যগুলি দেখুন unix.stackexchange.com/Qestions/8121/… (এখানে একই জিনিস পুনরায় লেখার চেয়ে)
পিটার.ও

'স্প্লিট' ব্যবহার করে আপনি একবারে প্রতিটি একক বাইট স্পর্শ করেন। যদি আপনি এটি করেন তবে আপনি পুরো 8 জিবিও গ্রেপ করতে পারেন।
আকিরা

@ সিফুসাম .. আমি বাইনারি বিভক্ত অনুসন্ধান করতে চাই (কেবল ফাইলগুলি বিভক্ত নয়) en.wikedia.org/wiki/Binary_search_algorithm ... সুতরাং এটি একটি পৃথক প্রশ্নের উত্তম উত্তর ছিল :) :) উত্তর দেওয়ার জন্য ধন্যবাদ .. আপনাকে ঘূর্ণায়মান করার জন্য +1 ....
পিটার.ও

0

এখানে আমার স্ক্রিপ্ট, আমি প্রথম লাইনের সন্ধান করছি প্রথম ক্ষেত্রটি আমার সংখ্যার সাথে মেলে। প্রথম ক্ষেত্র অনুযায়ী লাইনগুলি বাছাই করা হয়। আমি 128 কে ব্লকের প্রথম লাইনটি পরীক্ষা করতে ডিডি ব্যবহার করি, তারপরে আমি ব্লকে ঝাঁপিয়ে একটি অনুসন্ধান করবো। এটি দক্ষতা উন্নতি করে ফাইলটি 1 এম এর বেশি।

কোন মন্তব্য বা সংশোধন প্রশংসা করা হয়!

#!/bin/bash

search=$1;
f=$2;

bs=128;

max=$( echo $(du $f | cut -f1)" / $bs" | bc );
block=$max;
for i in $(seq 0 $max); do
 n=$(dd bs=${bs}K skip=$i if=$f 2> /dev/null| head -2 | tail -1 | cut -f1)
 if [ $n -gt $search ]; then
  block=`expr $i - 1` 
  break;
 fi
done; 
dd bs=${bs}K skip=$block if=$f 2> /dev/null| tail -n +2 | awk -v search="$search" '$1==search{print;exit 1;};$1>search{exit 1;};';

* সম্পাদনা করুন * ** গ্রেপ আরও দ্রুত এবং এস্ক আরও ভাল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.