লাইনের সংখ্যার সংখ্যা বাছাই করুন এবং গণনা করুন


144

আমার Apacheলগফিল আছে access.log, কীভাবে সেই ফাইলটিতে লাইন সংখ্যার সংখ্যা গণনা করব? উদাহরণস্বরূপ ফল cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'হয়

a.php
b.php
a.php
c.php
d.php
b.php
a.php

যে ফলাফলটি আমি চাই তা হ'ল:

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 

25
| sort | uniq -c
— কস্টাস

3
| LC_ALL=C sort | LC_ALL=C uniq -c
— স্টাফেন চেজেলাস

আহ আমি কখনই জানি uniqনা যে এটি করতে পারে ..
— কোকিজু

লগটিতে আপনার কি লাইনটির উদাহরণ রয়েছে, যেমন আমি মনে করি এটি সমস্ত পাইপ ছাড়াই অজস্র দিয়ে করা যেতে পারে।

ঠিক আছে, 8.1 গিগাবাইট লগ ফাইলটি প্রায় 2 মিনিটের মধ্যে প্রক্রিয়াজাত হয়, এবং এটি আপাতত শেষ হয়ে গেছে, এখন আর
— এটির

উত্তর:


195
| sort | uniq -c

মতামত হিসাবে বলা হয়েছে।

আউটপুটটি পাইপ করা sortআউটপুটটিকে বর্ণানুক্রমিক / সংখ্যাসূচক ক্রমে সংগঠিত করে।

এটি প্রয়োজনীয়তা কারণ uniqকেবল পুনরাবৃত্ত লাইনের সাথে মেলে ie

a
b
a

আপনি যদি uniqএই টেক্সট ফাইলে ব্যবহার করেন তবে এটি নিম্নলিখিতটি ফিরিয়ে দেবে:

a
b
a

এটি কারণ যে দুটি aগুলি পৃথক পৃথক b- তারা পরপর রেখা নয়। তবে আপনি যদি প্রথমে বর্ণানুক্রমিক ক্রমে ডেটা বাছাই করেন তবে প্রথম পছন্দ করুন

a
a
b

তারপরে uniqপুনরাবৃত্তি করা লাইনগুলি সরিয়ে ফেলবে। -cবিকল্প uniqগন্য সদৃশ সংখ্যা এবং আকারে আউটপুট প্রদান করে:

2 a
1 b

তথ্যসূত্র:


1
ইউনিক্স ও লিনাক্সে স্বাগতম :) আপনার উত্তরে আরও বিশদ যুক্ত করতে এবং কেন এবং কীভাবে এটি কাজ করে তা ব্যাখ্যা করতে দ্বিধা করবেন না;)
— জন

1
printf '%s\n' ①.php ②.php | sort | uniq -cআমাকে দেয়2 ①.php
— স্টাফেন চ্যাজেলাস

@ php\nphp

4
@ জিদার, না, কারণ এটি আমার লোকেলের ①.phpমতোই ②.phpবাছাই করে কারণ আমার লোকালে যারা ①এবং ②চরিত্রের জন্য কোনও বাছাইয়ের অর্ডার সংজ্ঞায়িত করা হয়নি । যদি আপনি কোনও বাইট মানগুলির জন্য অনন্য মান চান (মনে রাখবেন ফাইল পাথগুলি প্রয়োজনীয়ভাবে পাঠ্য নয়) তবে আপনাকে লোকেলটি সি: এ ঠিক করতে হবে | LC_ALL=C sort | LC_ALL=C uniq -c।
— স্টাফেন চেজেলাস

2
ফলাফল হিসাবে গণনা করা ফাইলটি বাছাই করতে আপনার নীচে @ এডওয়ার্ড-ফ্লোরাইনস্কু উত্তর হিসাবে "সাজানো-এনআর" যোগ করার কথা বিবেচনা করা উচিত।
— Lluís Suñol

104
[your command] | sort | uniq -c | sort -nr

গৃহীত উত্তরটি প্রায় সম্পূর্ণ আপনি সম্ভবত sort -nrপ্রায়শই প্রায়শই ঘটে এমন লাইনগুলি দিয়ে ফলাফলগুলি সাজানোর জন্য শেষে একটি অতিরিক্ত যুক্ত করতে চাইতে পারেন

ইউনিক বিকল্পসমূহ:

-c, --count
       prefix lines by the number of occurrences

বাছাই বিকল্পগুলি:

-n, --numeric-sort
       compare according to string numerical value
-r, --reverse
       reverse the result of comparisons

নির্দিষ্ট ক্ষেত্রে আপনি যে লাইনগুলি বাছাই করছেন সেগুলি হল সংখ্যাগুলি, আপনার sort -grপরিবর্তে ব্যবহারের প্রয়োজন sort -nr, মন্তব্য দেখুন


3
-nবিকল্প সম্পর্কে আমাকে জানানোর জন্য অনেক ধন্যবাদ ।
— সিগুর

2
গ্রেট উত্তর, এখানে কি আমি বাক্য ফাইল থেকে একটি শব্দ সংখ্যা পেতে ব্যবহার আছে: tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt। প্রথম কমান্ডটি নতুন লাইনের সাথে স্পেসগুলি প্রতিস্থাপন করে, যাতে অন্য কমান্ডটি প্রত্যাশিতভাবে কাজ করতে পারে।
— বার

2
উপরের বিকল্পগুলি ব্যবহার করে আমি "23344" এর আগে "1" পাই। sort -grপরিবর্তে ব্যবহার করা এটি সমাধান করে। -g: সাধারণ সংখ্যাসূচক মান অনুসারে তুলনা করুন (এর পরিবর্তে -n: স্ট্রিংয়ের সংখ্যাসম্য অনুসারে তুলনা করুন)।
— পিটার জারিক

@ পিটারজারিক গ্রেট ক্যাচ এবং এটি সম্পর্কে জানতে খুব দরকারী -grতবে আমি মনে করি যে ফলাফলটি uniq -cযেমন sort -nrহবে ঠিক তেমন কাজ করবে
— এডুয়ার্ড ফ্লোরিয়েনসু

3
আসলে, যখন ডেটা সংখ্যা হয়, -grআরও ভাল কাজ করে। কেবলমাত্র জি এবং এন পতাকাগুলিতে পৃথক হয়ে এই দুটি উদাহরণ ব্যবহার করে দেখুন: echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nrএবং echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr। প্রথমটি ভুলভাবে বাছাই করে তবে দ্বিতীয়টি নয়।
— পিটার জারিক

9

আপনি awk এ একটি সহযোগী অ্যারে ব্যবহার করতে পারেন এবং তারপরে যথাযথভাবে সাজান :

cat access.log  | awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' | sort

আউটপুট:

1 c.php
1 d.php
2 b.php
3 a.php

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