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


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.