किसी फ़ाइल में एक पंक्ति के अंतिम कॉलम को प्रिंट करना


135

मेरे पास एक फाइल है जिसे लगातार लिखा / अपडेट किया जा रहा है। मैं एक विशेष शब्द वाली अंतिम पंक्ति को खोजना चाहता हूं, फिर उस रेखा के अंतिम कॉलम को प्रिंट करूंगा।

फ़ाइल कुछ इस तरह दिखती है। अधिक A1 / B1 / C1 लाइनों को समय के साथ जोड़ा जाएगा।

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}'

@EdMorton बिल्कुल सही है। अक्क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
आपको grep + awk की कभी आवश्यकता नहीं है क्योंकि awk यह स्वयं की RE तुलना कर सकता है। "grep A1 | awk '{print $ NF}'" बस "awk '/ A1 / {प्रिंट $ NF}" होना चाहिए। इसके अलावा, यदि आप पूंछ का उपयोग नहीं कर रहे हैं, तो आपको पूंछ की बिल्कुल भी आवश्यकता नहीं है, योयू बस कर सकता है: awk '/ A1 / {f = $ NF} END {प्रिंट f}' फ़ाइल
एड मॉर्टन

यह बिलकुल सही नहीं है, क्योंकि हो सकता है कि कॉलम उस विंडो में दिखाई न दे जो कच्चा tailआपको देता है। जब तक आप नहीं जानते कि यह एक निश्चित आवृत्ति के साथ दिखाई देने वाला है, यह सुरक्षित होगा awk '/A1/ {print $NF}' file | tail -n1
मिशेल ट्रेसी


12

उपयोग करने का एक तरीका awk:

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

मैंने सोचा था कि पोस्ट की गई समस्या का सही समाधान था (+1!) लेकिन अब मैं देख रहा हूं कि मुझे सवाल समझ नहीं आ रहा है। ओपी फ़ाइल के पिछले लाइन से अंतिम क्षेत्र चाहता है, लेकिन अगर आप पूंछ -f का उपयोग कर रहे हैं तो कोई अंतिम लाइन नहीं है। शायद वह फ़ाइल में अंतिम पंक्ति का मतलब है, जिस स्थिति में मेरी अन्य टिप्पणियों में से एक देखें।
एड मॉर्टन

बहुत अच्छा और सरल। थम्स अप। अंगूठे का awkगूढ़ वाक्य विन्यास के लिए नीचे :)
पुं

11

आप बस कुछ पाइपों के साथ जाग के बिना ऐसा कर सकते हैं।

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

यह आपकी समस्या को हल करता है, लेकिन यह वास्तव में awk का उपयोग नहीं करता है। आशा है कि यह आपके लिए वैसे भी काफी अच्छा है।
जियोनी


2

आप इसमें सब कर सकते हैं awk:

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

1
आपको विभाजन () और एक सरणी की आवश्यकता नहीं है, बस अंतिम फ़ील्ड को सहेजें और प्रिंट करें: awk '/ A1 / {f = $ NF} END {प्रिंट f}' फ़ाइल
एड मॉर्टन

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 की अंतिम घटना के लिए पूछता है। आपका जवाब सभी मैचों को प्रिंट करेगा .. btw अगर आपको मेरा जवाब पसंद आया, तो
कृपया

1

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

awkफ़ील्ड विभाजक के साथ प्रयोग करें -F को एक स्थान पर सेट करें ""।

पैटर्न $1=="A1" और एक्शन का उपयोग करें {print $NF}, यह हर रिकॉर्ड में अंतिम फ़ील्ड प्रिंट करेगा जहां पहला फ़ील्ड "A1" है। पूंछ में परिणाम को पाइप करें और -n 1केवल अंतिम पंक्ति दिखाने के लिए विकल्प का उपयोग करें ।


0

इसे फ़ाइल पर निष्पादित करें:

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

और आपको वही मिलेगा जो आप ढूंढ रहे हैं।


0

यहाँ वास्तविक मुद्दा नहीं है, लेकिन कुछ मदद कर सकता है: मैं कर रहा था awk "{print $NF}", गलत उद्धरण ध्यान दें। होना चाहिए awk '{print $NF}', ताकि शेल का विस्तार न हो $NF


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.