วิธีรับสตริงย่อยจากคำสั่ง bash


8

กำหนดสตริงย่อยต่อไปนี้ที่ได้รับจากคำสั่งdf /dev/sdb1 | tail -n 1:

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

ฉันต้องการแยก1952971772และ74%จากสตริงนั้นเพื่อใช้ในสคริปต์ทุบตี

ฉันรู้ว่าฉันสามารถใช้คำสั่งตัดบางอย่างหรือบางอย่าง แต่มันจะไม่ทำงานอีกต่อไปหากมีการเปลี่ยนแปลงขนาดเช่น

ฉันยังมีความคิดเกี่ยวกับการใช้ regex หรือบางสิ่งบางอย่าง แต่ฉันต้องการมีแนวทางที่แนะนำมากที่สุด

ขอบคุณล่วงหน้า!


2
คุณกำลังถามเกี่ยวกับกรณีทั่วไปหรือdfโดยเฉพาะอย่างยิ่ง? หากหลังคุณสามารถระบุฟิลด์เอาต์พุตเฉพาะอย่างชัดเจนเช่นdf --output=pcent /dev/sdb1
steeldriver

2
คุณกำลังใช้cutตำแหน่งอักขระในบรรทัดซึ่งทำให้มันล้มเหลวเมื่อความยาวบรรทัดเปลี่ยนไปตามความผันผวนของขนาดไฟล์ ฉันเชื่อว่าคุณสามารถบอกcutให้เลือกคอลัมน์2และคอลัมน์ที่มีการ5เว้นวรรค แต่ฉันอยู่ในโทรศัพท์และไม่สามารถค้นคว้าและโพสต์คำตอบได้อย่างมีประสิทธิภาพ
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix จำนวนช่องว่างอาจแตกต่างกันไปดังนั้นจึงเป็นการยากที่จะบอกว่าหมายเลขคอลัมน์ใดถูกต้อง cutจะเห็นหนึ่งคอลัมน์หลังตัวคั่นแต่ละตัว
mook765

ช่องว่างที่ต่อเนื่องกันตั้งแต่สองช่องขึ้นไปยังนับเป็นช่องว่างเดียวสำหรับกำหนดคอลัมน์ที่ฉันคิดว่า
WinEunuuchs2Unix

@ WinEunuuchs2Unix ถูกต้อง :) ฉันคำสั่งจากไฟล์ข้อความที่ฉันมีในมือ: D
Rinzwind

คำตอบ:


6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

สำหรับเปอร์เซ็นต์และ

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

สำหรับขนาด

ไม่มีtail:

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    รับคอลัมน์ที่ 2 โดยที่ตัวคั่นหลายตัวนับเป็น 1 ดังนั้นคอลัมน์ที่ 2 จะเหมือนกันเสมอสำหรับระบบของคุณสำหรับส่วนที่ 1 ของคำสั่ง

  • NR ให้จำนวนระเบียนทั้งหมดที่กำลังดำเนินการหรือหมายเลขบรรทัด


1
df /home | awk '{print $2; print $5;}'หรือหากคุณต้องการทั้งในหนึ่งบรรทัด
Videonauth

3
Awk เก็บบรรทัดสุดท้ายไว้ในENDบล็อกดังนั้นแทนที่จะใช้tailเพียงใช้awk 'END { print $2,$5}'
Kevin

FYI ฉันชื่อลดลงคุณใน Meta :) meta.askubuntu.com/questions/18584/ …
WinEunuuchs2Unix

8

แก้ไขคำตอบแล้ว

ตามที่ @kevin ระบุไว้คุณสามารถใช้awkเพื่อเลือกเฉพาะบรรทัดสุดท้ายและหลีกเลี่ยงการใช้ส่วนท้ายด้วยการใช้ENDและถ้าคุณต้องการพิมพ์สองคอลัมน์ในครั้งเดียวคุณสามารถทำได้:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

คำตอบเดิม

คุณสามารถเลือกคอลัมน์ที่ 2 เท่านั้น:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

โดยที่$2ระบุตำแหน่งของคอลัมน์ที่คั่นด้วย TAB คุณสามารถใช้cutเพราะมันรองรับ TAB เพียงครั้งเดียวและที่นี่มีแท็บทวีคูณเพื่อกำหนดคอลัมน์


3
Awk เก็บบรรทัดสุดท้ายไว้ในENDบล็อกดังนั้นแทนที่จะใช้tailเพียงใช้awk 'END { print $2,$5}'
Kevin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.