কোনও ফাইলে একটি লাইনের শেষ কলামটি মুদ্রণ করা হচ্ছে


135

আমার কাছে এমন একটি ফাইল রয়েছে যা নিয়মিত লিখে / আপডেট করা হচ্ছে। আমি একটি নির্দিষ্ট শব্দ সম্বলিত সর্বশেষ লাইনটি খুঁজতে চাই, তারপরে সেই লাইনের শেষ কলামটি মুদ্রণ করব।

ফাইলটি এরকম কিছু দেখাচ্ছে। সময়ের সাথে সাথে আরও এ 1 / বি 1 / সি 1 লাইন যুক্ত করা হবে।

A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434

আমি ব্যবহার করার চেষ্টা করেছি

tail -f file | grep A1 | awk '{print $NF}'

766 মান মুদ্রণ করতে, কিন্তু কিছুই আউটপুট হয় না।

এই কাজ করতে একটি উপায় আছে কি?

উত্তর:


199

বাফারিংয়ের কারণে আপনি কিছু দেখতে পাচ্ছেন না। আউটপুট প্রদর্শিত হয়, যখন পর্যাপ্ত লাইন থাকে বা ফাইলের শেষ হয়। tail -fমানে আরও ইনপুটটির জন্য অপেক্ষা করুন, তবে কোনও লাইন নেই fileএবং তাই পাইপটি grepকখনও বন্ধ হয় না।

যদি আপনি আউটপুট -fথেকে বাদ পড়ে tailতা অবিলম্বে প্রদর্শিত হয়:

tail file | grep A1 | awk '{print $NF}'

@ এডমার্টন অবশ্যই ঠিক আছে। আওকA1 পাশাপাশি অনুসন্ধান করতে পারে যা কমান্ড লাইনকে ছোট করে তোলে

tail file | awk '/A1/ {print $NF}'

বা লেজ ছাড়াই থাকা সমস্ত লাইনের শেষ কলামটি দেখানো হচ্ছে A1

awk '/A1/ {print $NF}' file

@ মিশেলট্রেসি এর মন্তব্যে ধন্যবাদ, tailএতে রেকর্ড থাকা মিস হতে পারে A1এবং এর ফলে আপনি কোনও ফলই পাবেন না। এটি স্যুইচ করে tailএবং awkফাইলের মাধ্যমে প্রথমে অনুসন্ধানের মাধ্যমে সমাধান করা যেতে পারে এবং তারপরেই শেষ লাইনটি দেখানো যেতে পারে :

awk '/A1/ {print $NF}' file | tail -n1

14
আপনার কখনই গ্রেপ + অ্যাজকের দরকার নেই যেহেতু অ্যাডকের নিজস্ব আরআর তুলনা করা যায়। "গ্রেপ এ 1 | awk '{মুদ্রণ $ NF}'" কেবল "awk" / A1 / {প্রিন্ট $ NF} "হওয়া উচিত। এছাড়াও, যদি আপনি লেজ -f ব্যবহার না করে থাকেন তবে আপনার লেজ লাগবে না, ইয়োইউ কেবল এটি করতে পারেন: awk '/ A1 / {f = $ NF} END {print f f' ফাইল
এড মর্টন

এটি একেবারেই ঠিক নয়, কারণ কাঁচা tailআপনাকে দেওয়ার উইন্ডোটিতে কলামটি উপস্থিত নাও হতে পারে । আপনি যদি না জানেন তবে এটি একটি নির্দিষ্ট ফ্রিকোয়েন্সি সহ উপস্থিত হতে চলেছে, তবে এটি নিরাপদ হবে awk '/A1/ {print $NF}' file | tail -n1
মিচেল ট্রেসি


12

একটি উপায় ব্যবহার awk:

tail -f file.txt | awk '/A1/ { print $NF }'

আমি ভেবেছিলাম পোস্ট পোস্ট করা সমস্যার সঠিক সমাধান এটি ছিল (+1!) তবে এখন আমি দেখছি আমি প্রশ্নটি বুঝতে পারি না। ওপি ফাইলটির সর্বশেষ লাইন থেকে শেষ ক্ষেত্রটি চায়, তবে আপনি যদি লেজ -f ব্যবহার করেন তবে সর্বশেষ লাইন নেই। হতে পারে তার অর্থ ফাইলটিতে সর্বশেষ লাইনটি CURRENTLY, সেক্ষেত্রে আমার অন্য একটি মন্তব্য দেখুন।
এড মর্টন

খুব ভাল এবং সহজ। থাম্বস আপ। awk
থাম্বস

11

আপনি কেবল কয়েকটি পাইপ দিয়ে এড়কি না করে এটি করতে পারেন।

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev

এটি আপনার সমস্যা সমাধান করে, তবে এটি সত্যিই বিশ্রী ব্যবহার করে না। আশা করি যাই হোক আপনার পক্ষে এটি যথেষ্ট ভাল।
মিয়ানো

4

সম্ভবত এই কাজ করে?

grep A1 file | tail -1 | awk '{print $NF}'

2

আপনি এগুলি সব করতে পারেন awk:

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'

1
আপনার বিভক্ত () এবং একটি অ্যারের দরকার নেই, কেবলমাত্র শেষ ক্ষেত্রটি সংরক্ষণ করুন এবং এটি মুদ্রণ করুন: awk '/ A1 / {f = $ NF} END {মুদ্রণ এফ}' ফাইল
এড মর্টন

2

পার্ল ব্যবহার করা

$ cat rayne.txt
A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434


$ perl -lane ' /A1/ and $x=$F[2] ; END { print "$x" } ' rayne.txt
766

$

দেখতে খুব জটিল দেখাচ্ছে, ঠিক করুনperl -lane 'print $F[2] if /A1/' rayne.txt
হাই-অ্যাঞ্জেল

1
@ হাই-অ্যাঞ্জেল..এ প্রশ্নটি এ 1-এর শেষ ঘটনাটি জিজ্ঞাসা করে। আপনার উত্তরটি সমস্ত ম্যাচ মুদ্রণ করবে .. বিটিডব্লু যদি আপনি আমার উত্তরটি পছন্দ করেন তবে
প্লিজ

1

awk -F " " '($1=="A1") {print $NF}' FILE | tail -n 1

awkফিল্ড বিভাজক -এফের সাথে একটি স্পেসে সেট করুন Use

প্যাটার্ন $1=="A1" এবং ক্রিয়া ব্যবহার করুন, এটি {print $NF}প্রতি রেকর্ডে সর্বশেষ ক্ষেত্রটি মুদ্রণ করবে যেখানে প্রথম ক্ষেত্রটি "এ 1"। ফলাফলটি লেজের মধ্যে পাইপ করুন এবং -n 1কেবল সর্বশেষ লাইনটি দেখানোর জন্য বিকল্পটি ব্যবহার করুন ।


0

এটি ফাইলটিতে চালিত করুন:

awk 'ORS=NR%3?" ":"\n"' filename

এবং আপনি যা খুঁজছেন তা পাবেন।


0

এখানে আসল ইস্যু নয়, তবে কারওর সাহায্য করতে পারে: আমি করছিলাম awk "{print $NF}", ভুল উক্তিটি নোট করুন। হওয়া উচিত awk '{print $NF}', যাতে শেলটি প্রসারিত না হয় $NF


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