বিপরীত গ্রেপিং


44

ধরা যাক, আমার কাছে খুব বড় একটি টেক্সট ফাইল রয়েছে (প্রায় 10.000.000 লাইন)। আমি grepশেষ থেকে এটি প্রয়োজন এবং একটি ফাইলের ফলাফল সংরক্ষণ করুন। কোন কাজটি সম্পাদন করার সবচেয়ে কার্যকরী উপায় কী?


10
আপনি যা চান তা ব্যবহার করুন tacএবং grepঅর্জন করুন ।
ভ্যালেন্টিন বজরামি

1
পোস্ট করা দুর্দান্ত সমাধানগুলি ছাড়াও, জিএনইউতে grepএকটি --max-count (number)স্যুইচ রয়েছে যা নির্দিষ্ট সংখ্যক ম্যাচের পরে বাতিল হয়, যা আপনার কাছে আকর্ষণীয় হতে পারে।
উলরিচ শোয়ার্জ

@ val0x00ff আপনি কি এই প্রশ্নটি একবার দেখে নিতে পারেন
c0rp

আপনি জানেন যে আপনার কতটা হিট হবে? যখন আপনি ভাবেন যে আপনার গ্রেপটি 3 টি লাইন খুঁজে পাবে, তখন গ্রেপিং শুরু করুন এবং পরে বিপরীত।
ওয়াল্টার এ

উত্তর:


46

ট্যাক / গ্রেপ সমাধান

tac file | grep whatever

বা কিছুটা কার্যকর:

grep whatever < <(tac file)

500MB ফাইল সহ সময়:

real    0m1.225s
user    0m1.164s
sys     0m0.516s

সমাধান / গ্রেপ সমাধান:

sed '1!G;h;$!d' | grep whatever

500 এমবি ফাইল সহ সময়: 10+ মিনিটের পরে বাতিল করা হয়েছে।

awk / গ্রেপ সমাধান:

awk '{x[NR]=$0}END{while (NR) print x[NR--]}' file | grep whatever

500MB ফাইল সহ সময়:

real    0m5.626s
user    0m4.964s
sys     0m1.420s

পার্ল / গ্রেপ সমাধান:

perl -e 'print reverse <>' file | grep whatever

500MB ফাইল সহ সময়:

real    0m3.551s
user    0m3.104s
sys     0m1.036s

2
sed, awkএবং perl(এই পদ্ধতি সহ) ঠিক আছে না যেহেতু তারা প্রথম থেকেই ফাইলটি পড়ে, যা খুব অদক্ষ। আমি মনে করি tacএটি সঠিক কাজ করে।
ভিঙ্ক 17

1
@ ভিনক 17 হ্যাঁ, সময়ের পরিসংখ্যানগুলি আপনি যা বলেছিলেন সেটিকে নির্দেশ করে।
বিশৃঙ্খলা

2
@ val0x00ff < <(tac filename)একটি পাইপের মতো দ্রুত হওয়া উচিত: উভয় ক্ষেত্রেই আদেশগুলি সমান্তরালভাবে চালিত হয়।
ভিঙ্ক 17

7
আপনি যদি দক্ষতার জন্য যাচ্ছেন tacতবে গ্রেপ পরে রাখাই ভাল। আপনি যদি মাত্র ১০ টি ম্যাচ সহ 10,000,000 লাইনের ফাইল পেয়ে থাকেন তবে tac10 মিটার নয় , কেবল 2 টি লাইন বিপরীত করতে হবে। grepএখনও পুরোপুরি উভয় উপায়ে যেতে হবে।
প্যাট্রিক

3
আপনি যদি এটির tacপরে রাখেন তবে grepএটি একটি পাইপ থেকে পড়তে হবে এবং তাই অনুসন্ধান করতে পারে না। যদি পাওয়া রেখার সংখ্যাটি বড় হয় তবে এটি কম দক্ষ (বা সম্পূর্ণ ব্যর্থ) হয়ে উঠবে।
জাজানস

17

এই সমাধানটি সাহায্য করতে পারে:

tac file_name | grep -e expression

3
tacহ'ল জিএনইউ কমান্ড। অন্যান্য অধিকাংশ সিস্টেমে, সমতূল্য tail -r
স্টাফেন চেজেলাস

@ স্টাফেন: কমপক্ষে কয়েকটি ইউনিক্স সিস্টেমে tail -rঅল্প সংখ্যক লাইনের মধ্যে সীমাবদ্ধ , এটি একটি সমস্যা হতে পারে।
রেডগ্রিটিব্রিক

1
@ রেডগ্রিটিব্রিক, এর জন্য আপনার কি কোনও রেফারেন্স রয়েছে, বা দয়া করে বলতে পারেন কোন সিস্টেমে এই সীমাবদ্ধতা রয়েছে?
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, এতে tail -r /etc/passwdব্যর্থ tail: invalid option -- 'r'। আমি কোর্টিলস -8.21-21.fc20.x86_64 ব্যবহার করছি।
ক্রিশ্চিয়ান সিউপিতু

@ ক্রিশ্চিয়ানসিয়ুপিটু, যেমনটি আমি বলেছিলাম, tacজিএনইউতে রয়েছে (এবং কেবলমাত্র জিএনইউতে ট্যাক রয়েছে) অন্যান্য অনেক ইউনিয়নে রয়েছে tail -r। জিএনইউ tailসমর্থন করে না-r
স্টাফেন চেজেলাস

10

এটি প্রথম ম্যাচটি খুঁজে পাওয়ার সাথে সাথেই চলে যায়:

 tac hugeproduction.log | grep -m1 WhatImLookingFor

নীচে প্রথম দুটি ম্যাচের আগে এবং পরে 5 টি লাইন দেয়:

 tac hugeproduction.log | grep -m2 -A 5 -B 5 WhatImLookingFor

মনে না রাখবেন -i(কেস সংবেদনশীল) যদি না আপনি গ্রিপকে ধীর করে দেবেন এমনটি না করেন।

আপনি যে সঠিক স্ট্রিংটি সন্ধান করছেন তা যদি জানেন তবে বিবেচনা করুন fgrep(ফিক্সড স্ট্রিং)

 tac hugeproduction.log | grep -F -m2 -A 5 -B 5 'ABC1234XYZ'

9

যদি ফাইলটি সত্যিই বড়, মেমরি পর্যাপ্ত জায়গা নেই, আমি ব্যবহার করবে Perlসঙ্গে ফাইল :: ReadBackwards থেকে মডিউল CPAN:

$ cat reverse-grep.pl
#!/usr/bin/perl

use strict;
use warnings;

use File::ReadBackwards;

my $pattern = shift;
my $rev = File::ReadBackwards->new(shift)
    or die "$!";

while (defined($_ = $rev->readline)) {
    print if /$pattern/;
}

$rev->close;

তারপর:

$ ./reverse-grep.pl pattern file

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

1
@ জাজাপার: এটি মেমরিরও দক্ষ, কারণ এটি যখন মেমরির মতো স্লুর্প ফাইলের পরিবর্তে লাইন দিয়ে ফাইল লাইন পড়ে tac
cuonglm

কেউ কি এর জন্য একটি -m সমর্থন যুক্ত করতে পারেন? আমি আসল ফাইলগুলিতে পরীক্ষা করতে চাই। দেখুন: gist.githubusercontent.com/ychaouche/…
ychaouche
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.