โปรดทราบว่าtr -s ' '
ตัวเลือกนี้จะไม่ลบช่องว่างนำหน้าใด ๆ หากคอลัมน์ของคุณจัดชิดขวา (เช่นเดียวกับps
pid) ...
$ ps h -o pid,user -C ssh,sshd | tr -s " "
1543 root
19645 root
19731 root
จากนั้นการตัดจะทำให้เกิดบรรทัดว่างสำหรับบางฟิลด์หากเป็นคอลัมน์แรก:
$ <previous command> | cut -d ' ' -f1
19645
19731
เห็นได้ชัดว่าเว้นแต่คุณจะนำหน้าด้วยช่องว่าง
$ <command> | sed -e "s/.*/ &/" | tr -s " "
ตอนนี้สำหรับกรณีเฉพาะของหมายเลข pid (ไม่ใช่ชื่อ) มีฟังก์ชันที่เรียกว่าpgrep
:
$ pgrep ssh
ฟังก์ชันเชลล์
อย่างไรก็ตามโดยทั่วไปแล้วยังคงเป็นไปได้ที่จะใช้ฟังก์ชันเชลล์ในลักษณะที่กระชับเนื่องจากมีสิ่งที่เป็นระเบียบเกี่ยวกับread
คำสั่ง:
$ <command> | while read a b; do echo $a; done
พารามิเตอร์ตัวแรกที่จะอ่านa
จะเลือกคอลัมน์แรกและถ้ามีมากขึ้นทุกอย่างอื่นb
จะถูกวางใน เป็นผลให้คุณไม่จำเป็นตัวแปรเกินกว่าจำนวนคอลัมน์ของคุณ1
ดังนั้น,
while read a b c d; do echo $c; done
จากนั้นจะแสดงคอลัมน์ที่ 3 ตามที่ระบุไว้ในความคิดเห็นของฉัน ...
การอ่านไปป์จะดำเนินการในสภาพแวดล้อมที่ไม่ส่งผ่านตัวแปรไปยังสคริปต์การเรียกใช้
out=$(ps whatever | { read a b c d; echo $c; })
arr=($(ps whatever | { read a b c d; echo $c $b; }))
echo ${arr[1]}
โซลูชันอาร์เรย์
ดังนั้นเราจึงจบลงด้วยคำตอบโดย @frayser ซึ่งคือการใช้ตัวแปรเชลล์ IFS ซึ่งมีค่าเริ่มต้นเป็นช่องว่างเพื่อแยกสตริงออกเป็นอาร์เรย์ ใช้ได้เฉพาะใน Bash เท่านั้น Dash และ Ash ไม่รองรับ ฉันมีช่วงเวลาที่ยากลำบากในการแยกสตริงออกเป็นส่วนประกอบใน Busybox ง่ายพอที่จะรับองค์ประกอบเดียว (เช่นการใช้ awk) จากนั้นทำซ้ำสำหรับทุกพารามิเตอร์ที่คุณต้องการ แต่จากนั้นคุณจะเรียก awk ซ้ำ ๆ ในบรรทัดเดิมหรือใช้บล็อกการอ่านซ้ำที่มี echo ในบรรทัดเดียวกัน ซึ่งไม่มีประสิทธิภาพหรือสวย ดังนั้นคุณจึงแยกโดยใช้ ${name%% *}
และอื่น ๆ ทำให้คุณโหยหาทักษะ Python เพราะจริงๆแล้วการเขียนสคริปต์เชลล์ไม่ใช่เรื่องสนุกอีกต่อไปหากฟีเจอร์ที่คุณคุ้นเคยครึ่งหนึ่งหรือมากกว่านั้นหายไป แต่คุณสามารถสันนิษฐานได้ว่าแม้แต่ python ก็ไม่ได้รับการติดตั้งในระบบดังกล่าวและมันก็ไม่ใช่ ;-)