সেডযুক্ত একটি ফাইলের সমস্ত ঘটনা সন্ধান করুন


15

ওপেন স্টেপ ৪.২ ওএস ব্যবহার করছি ... আমি বর্তমানে নিম্নলিখিত sedকমান্ডটি ব্যবহার করছি :

sed -n '1,/141.299.99.1/p' TESTFILE | tail -3

এই কমান্ডটি 141.299.99.1 এর আইপি সহ একটি ফাইলের মধ্যে একটি উদাহরণ খুঁজে পাবে এবং এর আগে 3 টি লাইন অন্তর্ভুক্ত করবে যা সমস্ত ভাল, ব্যতিক্রমটি ছাড়াও আমি আইপি এর সমস্ত উদাহরণ এবং এর আগে 3 টি লাইন সন্ধান করতে চাই এবং শুধু প্রথম নয়।


1
দয়া করে সর্বদা আপনার ওএস অন্তর্ভুক্ত করুন। সমাধানগুলি প্রায়শই ব্যবহৃত হওয়া অপারেটিং সিস্টেমের উপর নির্ভর করে। আপনি কি ইউনিক্স, লিনাক্স, বিএসডি, ওএসএক্স, অন্য কিছু ব্যবহার করছেন? কোন সংস্করণ?
টেরডন

দুর্দান্ত পয়েন্ট! ওপেন স্টেপ সংস্করণ 4.2 ব্যবহার করা বেশ পুরানো এবং অন্তর্ভুক্ত শেলগুলি নীচের উত্তরে উল্লিখিত অনেকগুলি বৈশিষ্ট্য অন্তর্ভুক্ত করে না।
ডেল

কৌতূহলের বাইরে - একটি ওপেন স্টেপ ৪.২ সিস্টেম কী এবং এটি বর্তমানে কীভাবে ব্যবহৃত হয়?
থোরবজর্ন রাভন অ্যান্ডারসন

(এবং যদি পার্ল উপলভ্য থাকে তবে আপনি
এটির

: @ ThorbjørnRavnAndersen হয়তো এটা এই আছে en.wikipedia.org/wiki/OpenStep
Barmar

উত্তর:


4

এই জিএনইউ সিড উদাহরণেরgrep -B3 উপর ভিত্তি করে একটি সেড মুভিং উইন্ডোটি ব্যবহার করে অনুকরণ করার চেষ্টা করা হয়েছে (তবে আশা করি পসিক্স-অনুগত - @ স্টাফেনচাজেলাসের সাথে স্বীকৃতি সহ):

sed -e '1h;2,4{;H;g;}' -e '1,3d' -e '/141\.299\.99\.1/P' -e '$!N;D' file

প্রথম দুটি এক্সপ্রেশন একটি মাল্টি-লাইন প্যাটার্ন বাফারকে প্রধান করে এবং এটি প্রথম প্রান্তের আগে পূর্ববর্তী প্রসঙ্গে 3 টিরও কম লাইন রয়েছে এমন প্রান্তের কেসটি পরিচালনা করতে দেয়। মধ্যম (রেজেক্স ম্যাচ) এক্সপ্রেশনটি উইন্ডোটির শীর্ষে একটি লাইন মুদ্রণ করবে যতক্ষণ না প্যাটার্ন বাফারের মাধ্যমে কাঙ্ক্ষিত ম্যাচের পাঠ্যটি ছড়িয়ে যায়। চূড়ান্তভাবে $!N;Dউইন্ডোটি এক লাইনে স্ক্রোল করে যখন ইনপুটটির শেষে পৌঁছায় except


-eGNU নির্দিষ্ট নয়। পসিএক্স / পোর্টেবল হওয়ার জন্য আপনার এটি দরকার কারণ এটির পরে আর কিছু হতে পারে না }(এবং ;এটির আগে আপনাকে একটি প্রয়োজন )।
স্টাফেন চেজেলাস

ধন্যবাদ @ স্টাফেনচাজেলাস - তাই আপনি কি বলছেন যে পসআইএক্স / পোর্টেবল হওয়ার জন্য, প্রথম গোষ্ঠীকে বিভক্ত / সংশোধন করা দরকার -e '1h;2,4{H;g;}' -e '1,3d'? আমার কাছে পরীক্ষা করার জন্য একটি নন-জিএনইউ সিস্টেম নেই (এবং জিএনইউ সেড --posixসুইচটি তেমন যত্ন করে বলে মনে হচ্ছে না)।
স্টিল্ড্রাইভার

1
হ্যাঁ, লিনাক্স-এ আপনি sedউত্তরাধিকারী সরঞ্জামচেষ্ট থেকে পৃথক বাস্তবায়ন পরীক্ষা করতে পারেন যা theতিহ্যবাহী ইউনিক্স সেডের বংশধর। এর পসিক্স / ইউনিক্স স্পেসটি পাবস.ওপেনগ্রুপsed . org
স্টাফেন

আমি এগুলির দুটিতেও ইভেন্ট পাইনি: এন; ডি ': ইভেন্ট পাওয়া যায় নি। আমি কি কোথাও সিনট্যাক্স মিস করছি? ধন্যবাদ !!
ডেল

দুঃখিত, আমি সবেমাত্র বুঝতে পেরেছি যে আমার সাম্প্রতিক সম্পাদনাটি প্রথম-ই অভিব্যক্তির পরে একটি একক উদ্ধৃতি বাদ দিয়েছে। আমি এখনই এটি সংশোধন করেছি - আপনি কি দয়া করে উপরের অভিব্যক্তি দিয়ে আবার চেষ্টা করতে পারেন?
স্টিল্ড্রাইভার

10

grep এটির আরও ভাল কাজ করবে:

grep -B 3 141.299.99.1 TESTFILE

-B 3মানে প্রতিটি ম্যাচের আগে তিন লাইন প্রিন্ট করতে। এটি --প্রতিটি গ্রুপের লাইনের মধ্যে মুদ্রণ করবে । এটি অক্ষম করতে, --no-group-separatorপাশাপাশি ব্যবহার করুন ।

-Bবিকল্প দ্বারা সমর্থিত গনুহgrep এবং সবচেয়ে বাসদ সংস্করণ পাশাপাশি ( OSX এ , FreeBSD 'র , OpenBSD , NetBSD বা ), কিন্তু এটা টেকনিক্যালি একটি প্রমিত বিকল্প নয়।


1
মাইকেল হোমার - আপনাকে ধন্যবাদ। আমার কাছে বি বি বিকল্প নেই। অন্য কোন ধারণা?
ডেল

@ ডেল আপনি জিএনইউ গ্রেপ ইনস্টল করতে পারবেন? এটি আপনাকে বিকল্প দেবে।
বার্মার

9

sedআপনি সহ একটি স্লাইডিং উইন্ডো করতে পারেন।

sed '1N;$!N;/141.299.99.1/P;D'

এটা করে। তবে সাবধান থাকুন - উদ্ধৃত হওয়ার পরেওbash সম্প্রসারণের উন্মাদ আচরণ ! !!! আপনার কমান্ড ইতিহাস থেকে কমান্ড স্ট্রিং এ এটি কিছুটা ক্রেজি হতে পারে। set +H;আপনি যদি কেসটি খুঁজে পান তবে কমান্ডটির সাথে প্রিফিক্স করুন । এরপরে এটি পুনরায় সক্ষম করতে (তবে কেন ???) করুন set -H

যে, অবশ্যই, শুধুমাত্র প্রযোজ্য হবে যদি আপনি সেটা ব্যবহার bash- যদিও আমি বিশ্বাস করি না আপনি। আমি মোটামুটি নিশ্চিত যে আপনি কাজ করছেন csh- (যা এমন শেল যা এর উন্মাদ আচরণ bashইতিহাস প্রসারণের সাথে অনুকরণ করে, তবে সি শেলটি যে চূড়ান্তভাবে গ্রহণ করেছে তা নাও হতে পারে) । সুতরাং সম্ভবত একটি \!কাজ করা উচিত। আমি আশা করি.

এটি সমস্ত বহনযোগ্য কোড: পসিক্স তার তিনটি অপারেটরকে এভাবে বর্ণনা করে: (যদিও এটি লক্ষণীয় যে আমি কেবল 2001 এর প্রথম দিকে এই বিবরণটির অস্তিত্বই নিশ্চিত করেছি)

[2addr]Nআসল উপাদানটি মূল উপাদান থেকে পৃথক করতে \nএম্বেডড \nইওলাইনটি ব্যবহার করে, নিদর্শন জায়গাতে কম ইনপুট পরবর্তী লাইন যুক্ত করুন termin নোট করুন যে বর্তমান লাইন নম্বর পরিবর্তন হয়।

[2addr]P\nস্ট্যান্ডার্ড আউটপুটটিতে প্রথম ewline অবধি প্যাটার্ন স্পেসটি লিখুন ।

[2addr]D প্রথম \newline মাধ্যমে প্যাটার্ন স্পেসের প্রাথমিক বিভাগটি মুছুন এবং পরবর্তী চক্রটি শুরু করুন।

সুতরাং প্রথম লাইনে আপনি প্যাটার্ন স্পেসে একটি অতিরিক্ত রেখা যুক্ত করুন, সুতরাং এটি দেখতে এটির মতো দেখাচ্ছে:

^line 1s contents\nline 2s contents$

তারপরে প্রথম লাইন এবং তার পরে প্রতিটি লাইনে - একেবারে শেষ ব্যতীত - আপনি প্যাটার্ন স্পেসে অন্য লাইন যুক্ত করেন । সুতরাং এটির মতো দেখাচ্ছে:

^line 1\nline 2\nline 3$

যদি আপনার আইপি ঠিকানাটি খুঁজে পাওয়া যায় তবে আপনাকে Pপ্রথম নতুন লাইনটি ছড়িয়ে দেওয়া হয়েছে, সুতরাং এখানে 1 লাইন করুন। প্রতিটি চক্র শেষে আপনি Dএকই একাদশ এবং যা অবশিষ্ট আছে তা দিয়ে শুরু করুন। এরপরের চক্রটি দেখে মনে হচ্ছে:

^line 2\nline 3\nline 4$

... ইত্যাদি। যদি আপনার আইপিটি সেই তিনটির মধ্যে যে কোনও একটিতে পাওয়া যায় তবে প্রতিবার প্রিন্ট হয়ে যাবে। সুতরাং আপনি সবসময় কেবল তিনটি লাইন এগিয়ে থাকবেন।

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

seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'

10
18
19
20
28
29
30
38
39
40
48
49
50

এটি আপনার মামলার চেয়ে একটু জটিল কারণ কারণ আপনার সমস্যার সাথে আরও সাদৃশ্যপূর্ণ হওয়ার জন্য আমাকে 0\nনিউলাইন বা 0$প্যাটার্ন স্পেসের শেষ থেকে শুরু করে বিকল্প হতে হয়েছিল - তবে এগুলির অ্যাঙ্কর দরকারের তুলনায় তারা কিছুটা আলাদা - যা করা এখন থেকে কিছুটা কঠিন হতে পারে since প্যাটার্ন-স্থান ক্রমাগত স্থানান্তর।

আমি 10 এবং 52 এর বিজোড় কেসগুলি ব্যবহার করে দেখিয়েছি যে যতক্ষণ না নোঙ্গর নমনীয় হয় ততক্ষণ আউটপুট। সম্পূর্ণরূপে বহনযোগ্যভাবে, আমি পরিবর্তে অ্যালগরিদমে গণনা করে এবং একই ফলাফলগুলি অর্জন করতে পারি:

seq 10 52 | sed '1N;$!N;/[90]\n/P;D'

এবং আমার উইন্ডোটি সীমাবদ্ধ করার সময় অনুসন্ধানটি প্রশস্ত করুন - 0 থেকে 9 এবং 0 এবং 3 লাইন থেকে দুটিতে।

যাই হোক, আপনি ধারণা পেতে।


আপনার সমস্ত পরিশ্রমের জন্য ধন্যবাদ। দুঃখিত, আমি ফাইলটির নামটি কোথায় অনুসন্ধান করতে চাই?
ডেল

@ ডেল - আমার খারাপ sed '...' $filename। যাইহোক - আমি আপনার নিজের অনুসন্ধানের স্ট্রিং থেকে পিরিয়ডগুলিতে চলে এসেছি, তবে সেগুলি আসলে কোনও প্যাটার্ন নয় - এগুলি কোনও একক চরিত্রকে উপস্থাপন করে। oct\.oct\.oct\.octএগুলি থেকে বাঁচতে আপনার সম্ভবত করা উচিত তাই তারা কেবল পিরিয়ডের সাথে মেলে।
মাইকসার্ভ

আমি এটি এবং বিভিন্ন <> চিহ্ন সহ বিড়াল করার চেষ্টা করেছি এবং আমি এখানে অন্যান্য সমাধানের সাথে যা ইভেন্ট পেয়েছি তা পাওয়া যায় নি তাই আমি ভাবছি যে আমার ওএস এই সমাধানগুলির সাথে তুলনীয় নয় কিনা।
ডেল

এখন ফলাফল -> এন; / 141.299.99.1/P; ডি 'এর সাথে: ইভেন্টটি পাওয়া যায় নি।
ডেল

@ ডেল - দয়া করে আপডেটটি দেখুন। এটি আপনাকে সাহায্য করা উচিত।
মাইক্রজারভ

4

যেহেতু আপনি উল্লেখ করেছেন যে আপনার কাছে -Bবিকল্প নেই grep, আপনি পার্ল (উদাহরণস্বরূপ) 4 টি লাইনের একটি উইন্ডো স্লাইডিং করতে ব্যবহার করতে পারেন:

perl -ne '
    push @window,$_;
    shift @window if @window > 4;
    print @window if /141\.299\.99\.1/
' your_file

রমেশের উত্তরও একই রকম করে awk


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

@ ডেল আপনি খুব স্বাগতম আমি সন্দেহ করি যে এই কোডটি কোনও কাটিং-এজ পার্ল বৈশিষ্ট্য ব্যবহার করে।
জোসেফ আর।

4

যখন উপলব্ধ থাকে আপনি পিসিগ্রিপ ব্যবহার করতে পারেন :

pcregrep -M '.*\n.*\n.*\n141.299.99.1' file

আমার পিসিগ্রিগ আছে কিনা তা খতিয়ে দেখছি। আমি আদেশের সংক্ষিপ্ততা পছন্দ করি। আপনার সময় এবং প্রচেষ্টার জন্য অত্যন্ত কৃতজ্ঞ। ধন্যবাদ!!!
ডেল

4

আপনি শেল নিজেই অন্যান্য নন-গ্রেপ উত্তরগুলির মতো একই বেসিক পদ্ধতির প্রয়োগ করতে পারেন (এটি তুলনামূলকভাবে সাম্প্রতিক শেলকে সমর্থন করে =~):

while IFS= read -r line; do 
    [[ $line =~ 141.299.99.1 ]] && printf "%s\n%s\n%s\n%s\n" $a $b $c $line;
    a=$b; b=$c; c=$line; 
done < file 

বিকল্পভাবে, আপনি একটি অ্যারেতে পুরো ফাইল স্লર્প করতে পারেন:

perl -e '@F=<>; 
        for($i=0;$i<=$#F;$i++){
          print $F[$i-3],$F[$i-2],$F[$i-1],$F[$i] if $F[$i]=~/141.299.99.1/
        }' file 

আমার শেলটি অনেক পুরানো - স্টিভ জবস ওপেন স্টেপ। যদিও দুর্দান্ত ধারণা এবং আপনার সময়ের জন্য আপনাকে ধন্যবাদ !!! ডেল
ডেল

@ ডেল পার্ল অ্যাপ্রোচ প্রায় যে কোনও জায়গায় কাজ করবে। দয়া করে আমাদের আপনার অপারেটিং সিস্টেমটি (আপনার প্রশ্নের সাথে এটি যুক্ত করুন) বলুন যেভাবে আমরা আপনার জন্য কাজ করবে এমন জিনিসগুলির পরামর্শ দিতে পারি।
টেরডন

আমি যদি আপনার পার্ল অনুলিপি করে নোটপ্যাডে রাখি এবং এটি এক লাইনে রাখি তবে এটি কার্যকর হয়! প্রশ্ন - আমি চাইলে ম্যাচের প্যাটার্নের আগে 10 লাইন বলতে পারি যেখানে আমি 3 থেকে 10 পরিবর্তন করব? ধন্যবাদ!
ডেল

আমি দেখতে পাচ্ছি যে আমি আরও $ F [$ iX], স্টেটমেন্ট যুক্ত করে আরও লাইন যুক্ত করতে পারি। ধন্যবাদ!
ডেল

4

যদি আপনার সিস্টেম grepপ্রসঙ্গ সমর্থন করে না , আপনি পরিবর্তে ack-grep চেষ্টা করতে পারেন :

ack -B 3 141.299.99.1 file

ack প্রোগ্রামিংগুলির জন্য অনুকূলিতকরণ, গ্রেপের মতো একটি সরঞ্জাম।


আমি কমান্ডের সংক্ষিপ্ততা পছন্দ করি তবে আমার সিস্টেম ম্যান পৃষ্ঠাগুলি সন্ধানে আকিকে সমর্থন করে না। দুর্দান্ত ধারণা এবং আপনার সময়ের জন্য আপনাকে অনেক ধন্যবাদ !!! ডেল
ডেল

@ ডেল: সুপারিশিং! আপনার ওএস কি? আপনার যদি থাকে তবে আপনি perlব্যবহার করতে পারেন ack
cuonglm

2
awk '/141.299.99.1/{for(i=1;i<=x;)print a[i++];print} {for(i=1;i<x;i++)
     a[i]=a[i+1];a[x]=$0;}'  x=3 filename

এই awkদ্রবণটিতে একটি অ্যারে ব্যবহৃত হয় যা সর্বদা বর্তমান প্যাটার্নের আগে 3 লাইন থাকবে। সুতরাং, যখন প্যাটার্নটি মিলছে, তখন বর্তমান প্যাটার্নের সাথে অ্যারের সামগ্রীগুলি মুদ্রিত হবে।

পরীক্ষামূলক

-bash-3.2$ cat filename
10.0.0.1
10.0.0.2
10.0.0.3
10.0.0.4
141.299.99.1
10.0.0.5
10.0.0.6
10.0.0.7
10.0.0.8
10.0.0.9
10.0.0.10
141.299.99.1
10.0.0.11
10.0.0.12
10.0.0.13
10.0.0.14
10.0.0.15
10.0.0.16
141.299.99.1
10.0.0.17
10.0.0.18
10.0.0.19

কমান্ডটি কার্যকর করার পরে আউটপুটটি হয়

10.0.0.2
10.0.0.3
10.0.0.4
141.299.99.1
10.0.0.8
10.0.0.9
10.0.0.10
141.299.99.1
10.0.0.14
10.0.0.15
10.0.0.16
141.299.99.1

তাই বিস্তারিত - আপনাকে অনেক ধন্যবাদ। আমি এটা চেষ্টা করে দেখব. আপনার সময় জন্য খুব কৃতজ্ঞ !! ডেল
ডেল

আমার কাছে একটি পরীক্ষা ফাইল আছে এবং আপনার সমাধান কাজ করে! বিষয়টি যদিও আমি এটিকে আমার বড় প্রযোজনার ফাইলটিতে চালিত করি এটি খুব দীর্ঘ রেকর্ড নম্বর সহ ফিরে আসে যাতে আউটপুট কমান্ডটি দিয়ে কাজ করতে সক্ষম হয় না। এই পৃষ্ঠার শীর্ষে আমার মূল কমান্ডটি কাজ করে তবে কেবল একটি উদাহরণ খুঁজে পায়। আমি তোমার সাহায্য কে সাধুবাদ জানাই. এটির একাধিক তাত্পর্য খুঁজে পাওয়ার জন্য আমার আসল কমান্ডের সাথে আমি কী করতে পারি?
ডেল

1

এর বেশিরভাগ ক্ষেত্রে, /141.299.99.1/মিলবে (যেমন) 141a299q99+1বা 141029969951কারণও. নিয়মিত প্রকাশে কোনও চরিত্র উপস্থাপন করতে পারে।

ব্যবহার /141[.]299[.]99[.]1/নিরাপদ, এবং আপনি শুরুতে অতিরিক্ত প্রসঙ্গ যোগ করতে পারেন এবং নিশ্চিত করুন যে এটি মেলে না পুরো regexp শেষ করতে পারেন 3141., .12, .104, ইত্যাদি


1
এটি একটি ভাল পয়েন্ট - এবং আমিও বিবেচনা করেছি। তবুও, আমি প্রশ্নকর্তার দ্বারা সরবরাহিত স্ট্রিংটি একটি পরিচিত কার্যকরী ম্যাচ হিসাবে ব্যবহার করেছি - এবং সুযোগ পেলে তাঁকে ব্যক্তিগতভাবে অবহিত করেছি। যাইহোক - এই সবগুলি নয় - স্টিল্ড্রাইভারের উত্তর শুরু থেকেই চর ম্যাচটি উদ্ধৃত করেছে।
মাইক্রজারভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.