स्तंभ के बिना अंतिम अक्षर के साथ ऑक और printf

0

सवाल

मैं इस स्क्रिप्ट:

#!/bin/bash

f_status () {
        systemctl list-units | grep $1 | awk '{ printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",$1,$2,$3,$4) }'
}

f_line() {
        echo "-------------------------------------------------------------------------------------------"
}

echo ""
f_line
f_status "cron"
f_status "ssh"
f_line

इस स्क्रिप्ट मुझे देता है इस तरह के एक परिणाम:

-------------------------------------------------------------------------------------------
SERVICE STATUS:  cron.service                    loaded          active          running
SERVICE STATUS:  ssh.service                     loaded          active          running
-------------------------------------------------------------------------------------------

और मैं खोज निकालने के लिए कैसे ".सेवा" से 3 डी स्तंभ ।

मैं के साथ की कोशिश की substr($i, 0, -8) और ${1:-8}

किसी को भी किसी भी विचार है कैसे करने के लिए से छुटकारा पाने के 8 अक्षर से अंत करने के लिए बनाने के लिए इसे इस तरह देखो:

-----------------------------------------------------------------------------------
SERVICE STATUS:  cron                    loaded          active          running
SERVICE STATUS:  ssh                     loaded          active          running
-----------------------------------------------------------------------------------
awk bash printf
2021-11-23 11:39:15
3

सबसे अच्छा जवाब

0

आप की जरूरत कभी नहीं ग्रेप जब आप का उपयोग कर रहे हैं ऑक के बाद से grep 'foo' file | awk '{print 7}' लिखा जा सकता है बस के रूप में awk '/foo/{print 7}' file.

गिनती के बजाय अक्षर, बस सब कुछ को हटाने से शुरू पिछले .:

systemctl list-units |
awk -v tgt="$1" '
    {
        svc = $1
        sub(/\.[^.]*$/,"",svc)
    }
    svc == tgt {
        printf "SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",svc,$2,$3,$4
    }
'

मैं भी कड़ी कर दी गई अपनी तुलना से बचने के लिए झूठे मेल खाता है, तो कहा जाता है के साथ एक सेवा का नाम है कि एक सबसेट के कुछ अन्य सेवा के नाम या शामिल regexp metachars की तरह ..

2021-11-23 12:10:21

धन्यवाद आप के लिए तेजी से जवाब. धन्यवाद भी सलाह के लिए पर "ग्रेप" और "मुझे का पालन" - मैं हूँ कि मन में रखो । मैं खर्च पर 4 घंटे इस कार्य को और मुझे नहीं पता था कि कैसे इसे हल करने के लिए.
gacek

मैं अपने समाधान और उसके बाद अपनी सिफारिशों के लिए पोस्ट-प्रतिक्रिया व्यवहार । फिर से धन्यवाद और सबसे अच्छा संबंध है!
gacek
0

आप की जरूरत है की गणना करने के लिए अंत की स्थिति के आधार पर स्ट्रिंग की लंबाई पर विचार, निम्नलिखित सरल उदाहरण है, चलो file.txt सामग्री हो सकता है

cron.service
ssh.service

तो

awk '{print substr($1,1,length($1)-8)}' file.txt

आउटपुट

cron
ssh

स्पष्टीकरण: के लिए तर्क substr स्ट्रिंग हैं, शुरू की स्थिति, अंत की स्थिति, length वापस संख्या में वर्णों की स्ट्रिंग.

(परीक्षण में मूर्ख 4.2.1)

2021-11-23 12:04:06

धन्यवाद स्पष्टीकरण के लिए. मैं करने की कोशिश की इस तरह से पहले: substr($1, लंबाई, -8), लेकिन मुझे नहीं लगता था कि मैं निर्दिष्ट करना चाहिए एक चर जाना चाहिए कि पात्रों की संख्या गिनती.
gacek

@gacek length के बिना इस्तेमाल किया जब () बस चर पकड़ में पात्रों की संख्या पूरी लाइन ($0) के बजाय विशेष रूप से क्षेत्र में, उदाहरण के लिए, यदि आप फ़ाइल के साथ एकल लाइनों: 123 456 तो {print length} देता है 7, के रूप में यह 6 अंक और अंतरिक्ष.
Daweo

के बारे में length when used without () is just variable - नहीं, यह अभी भी एक समारोह फोन, यह सिर्फ आशुलिपि के लिए length($0). अगर यह था एक चर फिर, अन्य बातों के अलावा, आप एक मूल्य प्रदान करने के लिए है, लेकिन आप नहीं कर सकते हैं.
Ed Morton
0

आप उपयोग कर सकते हैं gsub funtion में ऑक,निम्नलिखित की तरह:

 systemctl list-units | grep 'cron' | awk '{gsub(".service","",$1); printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",$1, $2 ,$3,$4) }'
SERVICE STATUS:  crond                       loaded      active      running
2021-11-23 12:04:26

1) gsub() है बनाने के लिए कई प्रतिस्थापन जबकि आप केवल 1 क्या करना चाहते हैं, तो आप का उपयोग करना चाहिए sub() इसके बजाय, 2) पहला तर्क में से किसी के लिए *sub() कार्य करता है एक regexp, नहीं एक स्ट्रिंग है, तो आप का उपयोग करना चाहिए regexp /.../नहीं , स्ट्रिंग "...", सीमांकक, 3) तुम चाहिए लंगर अपने regexp के साथ एक को समाप्त करने $ तो आप को हटाने के पिछले घटना, लाइन पर पहली बार नहीं है, 4) आप की जरूरत है से बचने के लिए . में एक regexp या यह किसी भी मैच होगा चरित्र नहीं है, सिर्फ . आप मैच के लिए चाहते हैं, 5) आप की जरूरत है न grep जब का उपयोग कर youre awk के बाद से grep 'cron' | awk '{foo}' = awk '/cron/{foo}'.
Ed Morton

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में