বাশ স্ক্রিপ্ট: ফাইলটিতে অনন্য লাইন গণনা করুন


129

অবস্থা:

আমার কাছে বেশ কয়েকটি ঘন্টা নেটওয়ার্ক ক্যাপচার থেকে আইপি ঠিকানা এবং পোর্ট সহ একটি বড় ফাইল (কয়েক মিলিয়ন লাইন) রয়েছে, প্রতি লাইনে একটি আইপি / পোর্ট। লাইনগুলি এই ফর্ম্যাটটিতে রয়েছে:

ip.ad.dre.ss[:port]

কাঙ্ক্ষিত ফলাফল:

লগ ইন করার সময় আমি প্রাপ্ত প্রতিটি প্যাকেটের জন্য একটি এন্ট্রি রয়েছে, তাই এখানে অনেকগুলি সদৃশ ঠিকানা রয়েছে। আমি এটি কোনও ধরণের শেল স্ক্রিপ্টের মাধ্যমে এটি চালাতে সক্ষম হতে চাই যা এটি বিন্যাসের লাইনে হ্রাস করতে সক্ষম হবে

ip.ad.dre.ss[:port] count

যেখানে countনির্দিষ্ট ঠিকানা (এবং পোর্ট) এর সংখ্যার সংখ্যা। কোনও বিশেষ কাজ করতে হবে না, বিভিন্ন বন্দরকে আলাদা ঠিকানা হিসাবে বিবেচনা করুন।

এখনও অবধি, আমি লগ ফাইল থেকে সমস্ত আইপি ঠিকানাগুলি স্ক্র্যাপ করতে এই কমান্ডটি ব্যবহার করছি:

grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt

সে থেকে, আমি আমার ঠিকানায় প্রেরিত সমস্ত আইপি ঠিকানার (যা সম্পর্কে আমি যত্নশীল নই) সরিয়ে ফেলতে মোটামুটি সরল রেজেেক্স ব্যবহার করতে পারি

তারপরে আমি অনন্য এন্ট্রিগুলি নিষ্কাশন করতে নিম্নলিখিতটি ব্যবহার করতে পারি:

sort -u ips.txt > intermediate.txt

আমি জানি না কীভাবে আমি কোনওভাবে বাছাই করে লাইনটি গণনা করতে পারি।

উত্তর:


303

uniqবাছাই করা পুনরাবৃত্ত লাইনের সংখ্যা পেতে আপনি কমান্ডটি ব্যবহার করতে পারেন :

sort ips.txt | uniq -c

শীর্ষে সর্বাধিক ঘন ঘন ফলাফল পেতে (পিটার জারিককে ধন্যবাদ):

sort ips.txt | uniq -c | sort -bgr

10
আমি পছন্দ করি যে -bgrকাকতালীয়ভাবে স্মৃতিচারণের মতো দেখতে কেমন লাগে bigger, যা আমরা শীর্ষে চাই।
ডোয়ান্ডারসন

1
আপনার জন্য একটি ছোট ফাংশন হিসাবে .bashrcবা .bash_aliasesফাইল: function countuniquelines () { sort "$1" | uniq -c | sort -bgr; }। কল করে countuniquelines myfile.txt
জোহান

নিশ্চিত না কেন sort -nr
নাকিলন

5

করার গণনা অনন্য লাইন মোট সংখ্যা (অর্থাত ডুপ্লিকেট লাইন বিবেচনা করা নয়) আমরা ব্যবহার করতে পারি uniqবা awk সঙ্গে wc:

sort ips.txt | uniq | wc -l
awk '!seen[$0]++' ips.txt | wc -l

আউকের অ্যারেগুলি সম্মিলিত তাই এটি বাছাইয়ের চেয়ে কিছুটা দ্রুত চালাতে পারে।

পাঠ্য ফাইল তৈরি করা হচ্ছে:

$  for i in {1..100000}; do echo $RANDOM; done > random.txt
$ time sort random.txt | uniq | wc -l
31175

real    0m1.193s
user    0m0.701s
sys     0m0.388s

$ time awk '!seen[$0]++' random.txt | wc -l
31175

real    0m0.675s
user    0m0.108s
sys     0m0.171s

মজাদার. বিশাল ডেটাসেটগুলির জন্য একটি প্রশংসনীয় পার্থক্য তৈরি করতে পারে
ওয়াগ

1

এটি পুনরাবৃত্ত রেখার গণনা পাওয়ার দ্রুততম উপায় এবং এগুলি খুব ঘন ঘন ঘন ঘন ঘন ঘন দ্বারা সুন্দরভাবে মুদ্রিত করা হয়েছে:

awk '{!seen[$0]++}END{for (i in seen) print seen[i], i}' ips.txt | sort -n

আপনি যদি পারফরম্যান্সের বিষয়ে চিন্তা করেন না এবং আপনি মনে রাখতে আরও সহজ কিছু চান, তবে কেবল চালান:

sort ips.txt | uniq -c | sort -n

পুনশ্চ:

বাছাই -n ক্ষেত্রটিকে একটি সংখ্যা হিসাবে পার্স করুন, যেহেতু আমরা গণনাগুলি ব্যবহার করে বাছাই করছি correct


!মধ্যে {!seen[$0]++}এখানে অপ্রয়োজনীয় হয়, যেহেতু আমরা কেবলমাত্র এ প্রিন্টিং না END
আমির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.