ลบอักขระตัวสุดท้ายออกจากบรรทัด


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) เราบังคับawkให้ตีความฟิลด์ที่ 5 เป็นตัวเลขและทุกอย่างที่อยู่หลังตัวเลขจะถูกละเว้น

โปรดทราบว่า GNU df(ของคุณ-hเป็นส่วนขยาย GNU อยู่แล้ว แต่ไม่จำเป็นต้องใช้ที่นี่) สามารถบอกให้คุณส่งออกเฉพาะเปอร์เซ็นต์การใช้ดิสก์:

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

(หางข้ามส่วนหัวและ tr ลบทุกอย่างยกเว้นตัวเลขและตัวคั่นบรรทัด)

บน Linux ดูได้จาก:

findmnt -no USE%

9
{print +$5}จะทำงานได้ดี ...
jasonwryan

1
@ jasonwryan แต่น่าเสียดายที่มีการawkใช้งานมากมายที่ไม่สามารถใช้งานได้ซึ่งตัว+ดำเนินการ unary เพิ่งถูกเพิกเฉยและไม่บังคับให้แปลงสตริงเป็นตัวเลข
Stéphane Chazelas

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

@ jasonwryan ถ้างั้นฉันก็ชอบวิธีแก้ปัญหาของ Stephane ดีกว่า
แบร์นฮาร์ด

15

ฉันมีสองวิธี:

  1. ตัด: echo "somestring1" | rev | cut -c 2- | rev

    ที่นี่คุณย้อนกลับสตริงและตัดสตริงจากอักขระที่ 2 และย้อนกลับอีกครั้ง

  2. ใจเย็น ๆ echo "somestring1" | sed 's/.$//'

    ที่นี่คุณจะค้นหานิพจน์ทั่วไป.$ซึ่งหมายถึงอักขระใด ๆ ตามด้วยอักขระตัวสุดท้ายและแทนที่ด้วย null //(ระหว่างเครื่องหมายทับทั้งสอง)



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

คำตอบนี้อาจเป็นประโยชน์กับคนอื่น ๆ นอกเหนือจาก OP หากคุณสามารถให้คำอธิบายเล็กน้อยเกี่ยวกับวิธีการทำงานและอาจเป็นไปได้ว่าทำไมสิ่งนี้ถึงดีกว่าทางเลือกอื่น ๆ
Fox

ยินดีต้อนรับสู่ Unix Stackexchange! คุณสามารถทัวร์ชมเพื่อรับทราบว่าเว็บไซต์นี้ทำงานอย่างไร เมื่อให้คำตอบควรอธิบายว่าทำไมคำตอบของคุณจึงเป็นสิ่งที่ผู้อ่านต้องการ ซึ่งหมายความว่าเป็นการดีที่สุดถ้าคุณให้คำอธิบายเกี่ยวกับวิธีการใช้งาน หากคุณดูด้านบนคุณจะเห็นว่าคำตอบที่โหวตอย่างสูงทั้งหมดอธิบายรหัส
Stephen Rauch

โหวตขึ้นสำหรับการใช้งานcut -d '%' -f1ซึ่งเป็นคำตอบที่ถูกต้องเพื่อให้ได้ทุกอย่างในบรรทัดจนถึง '%' ครั้งแรก
Titou

รวมทั้งฉันเชื่อว่าคำตอบที่เป็นอันตราย / ไม่ถูกต้องเท่านั้นควรลดลงต่ำกว่า 0
Titou

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'ชื่อไฟล์บรรทัดที่ 1 และบรรทัดสุดท้าย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.