লাইন থেকে শেষ অক্ষর সরান


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'

(লেজ শিরোনামগুলি ছেড়ে যায় এবং টিআরটি অঙ্কগুলি এবং লাইন সীমানারগুলি বাদ দিয়ে সবকিছু সরিয়ে দেয়)।

লিনাক্সে, আরও দেখুন:

findmnt -no USE%

9
{print +$5}পাশাপাশি কাজ করবে ...
জেসনওয়ারিয়ান

1
@ জেসনওয়ারিয়ান, দুর্ভাগ্যক্রমে, অনেকগুলি 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
পাইপটি sedawkdf -h | awk '{gsub(/%/,""); print $5}'
অনর্থক

@ জেসনওয়ারিয়ান তারপর আমি স্টিফেনের সমাধান আরও ভাল পছন্দ করি।
বার্নহার্ড

15

আমার দুটি সমাধান রয়েছে:

  1. কাটা: echo "somestring1" | rev | cut -c 2- | rev

    এখানে আপনি স্ট্রিংটি বিপরীত করুন এবং ২ য় অক্ষর থেকে স্ট্রিংটি কেটে আবার বিপরীত করুন।

  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

এই উত্তরটি ওপি ছাড়িয়ে অন্যদের পক্ষে আরও সহায়ক হতে পারে যদি আপনি এটি কীভাবে কাজ করে সে সম্পর্কে কিছুটা ব্যাখ্যা সরবরাহ করতে পারেন এবং সম্ভবত বিকল্পগুলির চেয়ে এটি কেন ভাল হতে পারে
ফক্স

ইউনিক্স স্ট্যাকেক্সচেঞ্জে স্বাগতম! এই সাইটটি কীভাবে কাজ করে তার অনুভূতি পেতে আপনি ট্যুরটি নিতে পারেন । উত্তর দেওয়ার সময় আপনার উত্তরটি কেন পাঠক চান তা সম্পর্কে কিছুটা ব্যাখ্যা দেওয়া ভাল । এর অর্থ এটি কীভাবে কাজ করে তার কিছু ব্যাখ্যা দিলে এটি সবচেয়ে ভাল। আপনি যদি উপরে তাকান, আপনি দেখতে পাবেন যে সর্বাধিক ভোট দেওয়া উত্তরগুলির সমস্ত কোডটি ব্যাখ্যা করে।
স্টিফেন রাউচ

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

Alচ্ছিক : 1 ম এবং শেষ লাইনটি sed -ie '1d;$d'ফাইলের নামটি মুছতে


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