पहली कॉलन को कैसे निकालें ':' टाइमस्टैम्प से?


10

मैं प्रोग्रामिंग में नया हूँ !!

क्या कोई :टाइमस्टैम्प में पहली स्थिति में निकालने में मदद कर सकता है ::29.06.2019 23:03:17

वर्तमान में मैं इसे नीचे दिखाए गए अनुसार awk / cut कमांड का उपयोग करने की कोशिश कर रहा हूं:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2)"
echo "$TDS"


29.06.2019 23

और आउटपुट वह नहीं है जो मैं चाहता था! मैं इसे प्रिंट करना चाहता हूं 29.06.2019 23:03:17

जवाबों:


14

पहले पात्र को काटने के लिए, आप इसका उपयोग भी कर सकते हैं cut -c:

$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17

11

उपयोग

cut -d: -f2-

के बजाय

cut -d: -f2

दूसरे क्षेत्र से लाइन के अंत तक कुछ भी पाने के लिए:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2-)"
echo "$TDS"

8

awkएक अच्छा उपकरण है, और आप इसके साथ बहुत जटिल कार्यों को हल कर सकते हैं। लेकिन आपके प्रश्न के लिए मैं बैश की बुनियादी क्षमताओं से नहीं जुड़ा हूँ।

इस आसान विकल्प को हटाने के लिए, मैं निम्नलिखित कार्य करूंगा:

zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"

यह प्रिंट होगा:

29.06.2019 23:03:17

जब मैं आपकी स्थिति में था और मैंने प्रोग्रामिंग और बैश सीखना शुरू किया, तो मैंने इस हैंडबुक को बहुत कुछ सीखा:

ABS - एडवांस्ड बैश-स्क्रिप्टिंग गाइड

आपकी समस्या के कुछ और उदाहरण और रोचक जानकारी यहाँ मिल सकती है , 'सब्स्ट्रीम रिमूवल'।


3
+1 यह! चूँकि प्रश्न "बैश" को टैग किया जाता है, इसे बैश के महान (हालांकि अक्सर काफी अस्पष्ट) तारों को हेरफेर करने की क्षमताओं को प्राथमिकता देना माना जाना चाहिए जो बाहरी उपकरणों को लोड करने की तुलना में बहुत तेज़ हैं।
rexkogitans

2
@rexkogitans के बाद से हम पहले से ही एक फ़ाइल पार्स करने के लिए grep या awk बुला रहे हैं, तेज तेज नहीं होगा। वास्तव में, जब भी आपको फ़ाइल बैश पार्स करने की आवश्यकता होती है, तो यह धीमा होगा। सभी गोले धीमे होते हैं और दंश सबसे ज्यादा धीमा होता है। उस ने कहा, शेल की स्ट्रिंग हेरफेर क्षमताओं वास्तव में अक्सर सबसे अच्छा तरीका है, लेकिन केवल अगर आपके पास पहले से ही एक चर के रूप में इनपुट है।
टेराडॉन

8

यहाँ एक sedसमाधान है:

$ echo ':29.06.2019 23:03:17' | sed 's/^://'
29.06.2019 23:03:17

कमांड sed 's/^://'जो कर रहा है वह खाली स्ट्रिंग के साथ प्रत्येक पंक्ति की शुरुआत से sबृहदान्त्र वर्ण को प्रतिस्थापित करता है ।:^//

यहां एक मुश्किल awkसमाधान है, जहां हम ^:ऊपर वर्णित क्षेत्र विभाजक को बदल रहे हैं, और दूसरे क्षेत्र (प्रत्येक पंक्ति के) को आउटपुट करते हैं:

$ echo ':29.06.2019 23:03:17' | awk -F'^:' '{print $2}'
29.06.2019 23:03:17

कार्य को grep( स्पष्टीकरण ) के साथ भी पूरा किया जा सकता है , संभवतः यह बड़ी मात्रा में डेटा के लिए सबसे तेज़ समाधान हो सकता है:

$ echo 'Logfile started :29.06.2019 23:03:17' | grep -Po '^Logfile started :\K.*'
29.06.2019 23:03:17

या फ़ाइल को सीधे निम्न कमांड द्वारा संसाधित करें, जहां सीमा ^हटा दी गई है:

grep -Po 'Logfile started :\K.*' process.log

उपरोक्त sedसमूहों द्वारा भी प्राप्त किया जा सकता है ()->\1:

sed -nr 's/^.*Logfile started :(.*)$/\1/p' process.log

जहां अभिव्यक्ति ^.*<something>.*$पूरी रेखा से मेल खाएगी, जिसमें सम्‍मिलित है <something>। कमांड s/old/new/पहले कैप्चर ग्रुप (ब्रैकेट्स में अभिव्यक्ति अधिक ठोस हो सकती है) की सामग्री द्वारा इस लाइन को स्थानापन्न करेगी। विकल्प -rविस्तारित नियमित अभिव्यक्ति को सक्षम करता है। विकल्प -nसामान्य आउटपुट को दबा देगा sedऔर अंत में कमांड pमैचों को प्रिंट करेगा।


मुझे कभी नहीं पता था कि awkविशेष अर्थ वाले पात्रों के साथ एक बहु चरित्र एफएस हो सकता है! बात आज मैंने सीख ली।
फ्लोरिस

6

चूंकि आप इसमें पहले से ही प्रसंस्करण कर रहे हैं awk, आप पूरी तरह से सीधे काम कर सकते हैं:

$ echo "foo bar :29.06.2019 23:03:17" |  awk '{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17

subआदेश के सामान्य प्रारूप है sub(/REGEX/, REPLACEMENT, TARGET)और नियमित रूप से अभिव्यक्ति के लिए सभी मैचों का स्थान ले लेगा REGEXतार के साथ REPLACEMENTइनपुट स्ट्रिंग में TARGET। यहां, हम 3rd फ़ील्ड ( ) में से कुछ के साथ पहले :( ^मतलब "शुरुआत") की जगह ले रहे हैं $3

बेशक, अगर आप जाग में ऐसा कर रहे हैं, तो आप जागने में सब कुछ कर सकते हैं और एक ही ऑपरेशन में पूरी तरह से काम कर सकते हैं:

$ echo "Logfile started :29.06.2019 23:03:17" | 
    awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17

या, आपके मामले में:

TDS="$(awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' process.log)"
echo "$TDS"

0

एक और बैश समाधान:

$ echo "Logfile started :29.06.2019 23:03:17" | xargs bash -c 'echo "${2#*:} $3"'
29.06.2019 23:03:17
  • यह मध्यवर्ती चर असाइनमेंट के बजाय पाइपलाइन का उपयोग करता है।
  • आदेश कमांड के लिए स्थितीय मापदंडों को xargsधर्मान्तरित stdin(मानक इनपुट) करता है bash
  • बदलें echoके साथ tail -n1 /path/to/reportfile.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.