लाइन से अंतिम वर्ण निकालें


54

मैं अंतिम वर्ण को एक पंक्ति से निकालना चाहता हूं:

[root@ozzesh ~]#df -h | awk  '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%

अपेक्षित परिणाम:

Use
22
1
1
59
51
63
5

2
क्या यह हमेशा एक %संकेत है?
बर्नहार्ड

जवाबों:


83
sed 's/.$//'

अंतिम पात्र को हटाने के लिए।

लेकिन इस विशिष्ट मामले में, आप भी कर सकते हैं:

df -P | awk 'NR > 1 {print $5+0}'

अंकगणितीय अभिव्यक्ति ( $5+0) के साथ हम awk5 वें क्षेत्र को एक संख्या के रूप में व्याख्या करने के लिए मजबूर करते हैं, और संख्या के बाद कुछ भी अनदेखा किया जाएगा।

ध्यान दें कि GNU df(आपका -hपहले से ही एक GNU एक्सटेंशन है, हालाँकि यहाँ इसकी आवश्यकता नहीं है) को केवल डिस्क उपयोग प्रतिशत के उत्पादन के लिए ही कहा जा सकता है:

df --output=pcent | tail -n +2 | tr -cd '0-9\n'

(पूंछ हेडर को छोड़ देती है और tr सब कुछ हटा देती है लेकिन अंक और रेखा सीमांकक)।

लिनक्स पर, यह भी देखें:

findmnt -no USE%

9
{print +$5}के रूप में अच्छी तरह से काम करेंगे ...
jasonwryan

1
@ajonwryan, दुर्भाग्य से, बहुत सारे awkकार्यान्वयन हैं जहां यह काम नहीं करता है , जहां +एक्री संचालक को केवल अनदेखा किया जाता है और स्ट्रिंग्स के संख्यात्मक में रूपांतरण के लिए मजबूर नहीं करता है।
स्टीफन चेजलस

20

इसके साथ sed, यह बहुत आसान है:

$ cat file
Use%
22%
1%
1%
59%
51%
63%
5%
$ sed 's/.$//' file
Use
22
1
1
59
51
63
5

वाक्य-विन्यास है s(ubstitute)/search/replacestring/.किसी भी चरित्र, और इंगित करता है $पंक्ति के अंत। तो .$पिछले चरित्र को ही हटा देंगे।

इस स्थिति में, आपका पूरा कमांड दिखेगा:

df -h | awk '{ print $5}' | sed 's/.$//'

2
पाइप sedबेमानी है: यह में किया जा सकता है awk:df -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@ajonwryan तब मुझे स्टीफन का समाधान बेहतर लगा।
बर्नहार्ड

15

मेरे पास दो उपाय हैं:

  1. कट गया: echo "somestring1" | rev | cut -c 2- | rev

    यहां आप स्ट्रिंग को उल्टा करते हैं और स्ट्रिंग को 2nd कैरेक्टर से काटते हैं और फिर से रिवर्स करते हैं।

  2. सीड: echo "somestring1" | sed 's/.$//'

    यहां आप नियमित अभिव्यक्ति की खोज करेंगे, .$जिसका अर्थ है कि किसी भी वर्ण का अंतिम वर्ण और उसके बाद इसे शून्य //(दो स्लैश के बीच) से बदल दें



2

एक और दृष्टिकोण:

mapfile -t list < <(df -h)
printf '%s\n' "${list[@]%?}"

इसे फ़ंक्शन में बदलें:

remove_last() {
  local char=${1:-?}; shift
  mapfile -t list < <("$@")
  printf '%s\n' "${list[@]%$char}"
}

फिर इसे इस तरह से कॉल करें:

remove_last '%' df -h

mapfile एक bash4 सुविधा है।

यहाँ पकड़ यह है कि आपको हटाने के लिए एक चरित्र की आपूर्ति करनी चाहिए ; यदि आप चाहते हैं कि यह केवल वही हो जो अंतिम चरित्र होता है तो आपको पास होना चाहिए '?'या ''। उद्धरण आवश्यक है।



1

इसके साथ प्रयास करें:

df -h | awk  '{ print $5 }' | sed "s/%//"

सामान्य उपयोग है: (यानी)

VALUE=987654321
echo X123456789X | sed "s/123456789/${VALUE}/"

प्रतिक्रिया होनी चाहिए: X987654321X


1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1

यह उत्तर ओपी से परे दूसरों के लिए अधिक उपयोगी हो सकता है यदि आप इस बारे में थोड़ा स्पष्टीकरण प्रदान कर सकते हैं कि यह कैसे काम करता है और संभवतः यह विकल्प से बेहतर क्यों हो सकता है
फॉक्स

Unix Stackexchange में आपका स्वागत है! आप इस साइट के काम करने के तरीके के बारे में जानने के लिए दौरे का सहारा ले सकते हैं । उत्तर देते समय कुछ स्पष्टीकरण देना बेहतर होता है क्योंकि आपका उत्तर वह है जो पाठक चाहता है। इसका मतलब है कि यह सबसे अच्छा है यदि आप कुछ स्पष्टीकरण देते हैं कि यह कैसे काम करता है। यदि आप ऊपर देखते हैं, तो आप देखेंगे कि सभी अत्यधिक मतदान वाले उत्तर कोड की व्याख्या करते हैं।
स्टीफन राउच

उपयोग के लिए उत्कीर्ण, cut -d '%' -f1जो पहले '%' तक की लाइन में सब कुछ प्राप्त करने के लिए सही उत्तर है।
टिटौ

इसके अलावा मेरा मानना ​​है कि केवल हानिकारक / गलत जवाब कभी भी 0. से नीचे जाना चाहिए
टिटौ

0
sed -ie '$d' filename

here -i is to write changes
      e means expression
      $ means last line
      d means delete

Note:Without -e option $ wont work

वैकल्पिक : पहली और अंतिम पंक्ति को हटाने के लिए sed -ie '1d;$d'फ़ाइल नाम का उपयोग करें


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