กวดวิชา Bash Globbing

Bash Globbing Tutorial



Bash ไม่รองรับนิพจน์ทั่วไปของเนทีฟเหมือนภาษาโปรแกรมมาตรฐานอื่นๆ คุณลักษณะ Bash shell ที่ใช้สำหรับการจับคู่หรือขยายรูปแบบเฉพาะเรียกว่า globbing Globbing ส่วนใหญ่จะใช้เพื่อจับคู่ชื่อไฟล์หรือค้นหาเนื้อหาในไฟล์ Globbing ใช้อักขระตัวแทนเพื่อสร้างรูปแบบ อักขระตัวแทนทั่วไปส่วนใหญ่ที่ใช้สำหรับสร้างรูปแบบการวนรอบได้อธิบายไว้ด้านล่าง

'?' ใช้เพื่อจับคู่อักขระตัวเดียว คุณสามารถใช้ได้ '?' หลายครั้งสำหรับการจับคู่อักขระหลายตัว







ตัวอย่าง-1:



สมมติว่า คุณต้องการค้นหาชื่อไฟล์ข้อความที่มีชื่อยาว 4 อักขระและนามสกุลเป็น .txt . คุณสามารถใช้รูปแบบ globbing โดยใช้ ' ? ’ สี่ครั้งเพื่อทำภารกิจนี้



ค้นหารายการไฟล์และโฟลเดอร์ทั้งหมดของไดเร็กทอรีปัจจุบัน





$ลส-NS

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

$ ls -l ????.txt



ตัวอย่างที่ 2:

สมมติว่า คุณต้องการค้นหาไฟล์เอกสารที่มีชื่อยาว 8 อักขระ 4 ตัวแรกคือ ฉ, o, o และ NS และนามสกุลคือ เอกสาร . รันคำสั่งต่อไปนี้ด้วยรูปแบบ globbing เพื่อค้นหาไฟล์

$ลส -NSเท้า????.doc

ตัวอย่างที่ 3:

สมมติว่าคุณรู้ว่าชื่อไฟล์คือ 'ดีที่สุด' และนามสกุลมีความยาว 3 อักขระ แต่ไม่ทราบนามสกุล เรียกใช้คำสั่งต่อไปนี้โดยใช้ '? ' เพื่อค้นหาไฟล์ทั้งหมดที่มีชื่อ 'test' ที่มีนามสกุลยาวสามอักขระ

$ลส -NSดีที่สุด.???

เครื่องหมายดอกจัน – (*)

'*' ใช้เพื่อจับคู่อักขระศูนย์หรือมากกว่า หากคุณมีข้อมูลน้อยในการค้นหาไฟล์หรือข้อมูลใด ๆ คุณสามารถใช้ '*' ในรูปแบบลูกโลก

ตัวอย่าง -1:

สมมติว่า คุณต้องการค้นหาไฟล์ทั้งหมดของ 'กรุณา' ส่วนขยาย. เรียกใช้คำสั่งต่อไปนี้โดยใช้ '*' เพื่อทำภารกิจนั้น

$ลส -NS *.pl

ตัวอย่างที่ 2:

สมมติว่าคุณรู้จักตัวอักษรเริ่มต้นของชื่อไฟล์เท่านั้นซึ่งก็คือ 'ถึง' . เรียกใช้คำสั่งต่อไปนี้โดยใช้ '*' เพื่อค้นหาไฟล์ทั้งหมดของไดเร็กทอรีปัจจุบันที่มีชื่อขึ้นต้นด้วย 'ถึง' .

$ลส -NSถึง*.*

ตัวอย่างที่ 3:

คุณสามารถใช้ '*' ในสคริปต์ทุบตีเพื่อวัตถุประสงค์ต่างๆ โดยไม่ต้องค้นหาไฟล์ สร้างไฟล์ทุบตีชื่อ 'check.sh' ด้วยสคริปต์ต่อไปนี้ ที่นี่เมื่อผู้ใช้จะพิมพ์ ' y' หรือ 'Y' หรือ 'yes' หรือ 'Yes' แล้ว 'ยืนยัน' จะพิมพ์และเมื่อประเภทจะพิมพ์ 'n' หรือ 'N' หรือ 'no' หรือ 'No' แล้ว 'ไม่ได้รับการยืนยัน' จะพิมพ์

#!/bin/bash
โยนออก 'คุณต้องการที่จะยืนยัน?'
อ่านคำตอบ
กรณี $answer ใน
[ปปปป]* ) โยนออก 'ยืนยัน';;
[Nos]* ) โยนออก 'ไม่ได้รับการยืนยัน.';;
*) โยนออก 'ลองอีกครั้ง.';;
esac

เรียกใช้สคริปต์

$ทุบตีตรวจสอบ.sh

วงเล็บเหลี่ยม – ([])

'[]' ใช้เพื่อจับคู่อักขระจากช่วง การประกาศช่วงที่ใช้ส่วนใหญ่บางส่วนมีการกล่าวถึงด้านล่าง

ตัวอักษรตัวพิมพ์ใหญ่ทั้งหมดถูกกำหนดโดยช่วงเป็น [:upper:] หรือ [A-Z]

ตัวอักษรตัวพิมพ์เล็กทั้งหมดถูกกำหนดโดยช่วงเป็น [:lower:] หรือ [a-z]

ตัวเลขทั้งหมดถูกกำหนดโดยช่วงเป็น [:digit:] หรือ [0-9]

ตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กทั้งหมดถูกกำหนดโดยช่วงเป็น [:alpha:] หรือ [a-zA-z]

ตัวอักษรพิมพ์ใหญ่ อักษรตัวพิมพ์เล็ก และตัวเลขทั้งหมดถูกกำหนดโดยช่วงเป็น [:alnum:] หรือ [a-zA-Z0-9]

ตัวอย่าง -1:

เรียกใช้คำสั่งต่อไปนี้เพื่อค้นหาไฟล์และโฟลเดอร์ทั้งหมดที่มีชื่อประกอบด้วย NS หรือ อะไร หรือ NS หรือ NS .

$ลส -NS [p-s]*

ตัวอย่างที่ 2:

เรียกใช้คำสั่งต่อไปนี้เพื่อค้นหาไฟล์และโฟลเดอร์ทั้งหมดที่มีชื่อขึ้นต้นด้วยตัวเลขตั้งแต่ 1 ถึง 5

$ลส -NS [1-5]*

เขาขาด – (^)

คุณสามารถใช้ได้ '^' ด้วยวงเล็บเหลี่ยมเพื่อกำหนดรูปแบบลูกโลกให้เจาะจงมากขึ้น '^' สามารถใช้ภายในหรือภายนอกของวงเล็บเหลี่ยม '^' ใช้นอกวงเล็บเหลี่ยมเพื่อค้นหาเนื้อหาของไฟล์ที่ขึ้นต้นด้วยช่วงของอักขระที่กำหนด '^' ใช้ภายในวงเล็บเหลี่ยมเพื่อแสดงเนื้อหาทั้งหมดของไฟล์โดยเน้นบรรทัดที่ขึ้นต้นด้วยช่วงของอักขระที่กำหนด คุณสามารถใช้รูปแบบ globbing ประเภทต่างๆ ในการค้นหาเนื้อหาเฉพาะจากไฟล์ได้ 'จับ' คำสั่งใช้สำหรับค้นหาเนื้อหาใน bash สมมติว่าคุณมีไฟล์ข้อความชื่อ 'list.txt' โดยมีเนื้อหาดังต่อไปนี้ ทดสอบตัวอย่างต่อไปนี้สำหรับไฟล์นั้น

แอปเปิ้ล
4000
กล้วย
700
ส้ม
850
ลูกแพร์
9000
แจ็คดรูอิท

ตัวอย่าง – 1:

เรียกใช้คำสั่งต่อไปนี้เพื่อค้นหาบรรทัดเหล่านั้นจาก list.txt ไฟล์ที่ขึ้นต้นด้วย P หรือ Q หรือ R .

$ grep '^[P-R]' list.txt

ตัวอย่าง – 2:

เรียกใช้คำสั่งต่อไปนี้เพื่อเน้นบรรทัดเหล่านั้นจาก list.txt ไฟล์ที่ขึ้นต้นด้วย A หรือ B หรือ C .

$ grep '[^A-C]' list.txt

เครื่องหมายอัศเจรีย์ – (!)

คุณสามารถใช้ได้ '!' ภายในรูปแบบช่วง ทำงานเหมือนกับการใช้สัญลักษณ์ '^' นอกรูปแบบช่วง ตัวอย่างการใช้ '!' สัญญาณได้รับด้านล่าง

ตัวอย่าง – 1:

เรียกใช้คำสั่งต่อไปนี้เพื่อแสดงบรรทัดเหล่านั้นจาก list.txt ไฟล์ที่ขึ้นต้นด้วย 'P' หรือ Q หรือ R .

$ grep [!P-R] list.txt

ตัวอย่าง – 2:

เรียกใช้คำสั่งต่อไปนี้เพื่อแสดงบรรทัดเหล่านั้นจาก list.txt ไฟล์ที่ขึ้นต้นด้วยตัวเลขใดๆ จาก 4 ถึง 8 .

$ grep [!4-8] list.txt

เครื่องหมายดอลลาร์ – ($)

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

ตัวอย่าง – 1:

เรียกใช้คำสั่งต่อไปนี้เพื่อค้นหาบรรทัดเหล่านั้นจาก list.txt ไฟล์ที่ลงท้ายด้วย 'ถึง' .

$ grep a$ list.txt

ตัวอย่าง – 2:

เรียกใช้คำสั่งต่อไปนี้เพื่อค้นหาบรรทัดเหล่านั้นจาก list.txt ไฟล์ที่ลงท้ายด้วยตัวเลข ห้าสิบ .

$ grep 50$ list.txt

วงเล็บปีกกา – ({})

'{}' สามารถใช้เพื่อจับคู่ชื่อไฟล์ที่มีรูปแบบลูกโลกมากกว่าหนึ่งรูปแบบ แต่ละรูปแบบคั่นด้วย ',' ในวงเล็บปีกกาโดยไม่มีช่องว่าง ตัวอย่างบางส่วนได้รับด้านล่าง

ตัวอย่าง – 1:

เรียกใช้คำสั่งต่อไปนี้เพื่อค้นหาไฟล์ที่มีชื่อยาว 5 อักขระและนามสกุลเป็น 'NS' หรืออักษรสองตัวสุดท้ายของไฟล์คือ 'เซนต์' และนามสกุลคือ 'txt' .

$ ls -l {?????.sh,*st.txt}

ตัวอย่าง – 2:

เรียกใช้คำสั่งต่อไปนี้เพื่อลบไฟล์ทั้งหมดที่มีนามสกุลเป็น 'doc' หรือ 'docx' .

$rm {*.doc,*.docx}

ท่อ– ( | )

เครื่องหมาย '|' ยังใช้สำหรับใส่เงื่อนไขมากกว่าหนึ่งเงื่อนไขกับรูปแบบลูกโลก แต่ละรูปแบบจะถูกคั่นด้วยสัญลักษณ์ '|' ในคำสั่ง

ตัวอย่าง – 1:

เรียกใช้คำสั่งต่อไปนี้เพื่อค้นหาชื่อไฟล์ที่ขึ้นต้นด้วยอักขระ 'a' และมีนามสกุล 'bash' หรือ 'sh'

$ลสถึง*+(.ทุบตี|.NS)

ตัวอย่าง – 2:

สร้างไฟล์ทุบตีชื่อ 'menu.bash' และเพิ่มสคริปต์ต่อไปนี้ หากผู้ใช้พิมพ์ 1 หรือ S แล้วจะพิมพ์ ค้นหาข้อความ . หากผู้ใช้พิมพ์ 2 หรือ R แล้วจะพิมพ์ การแทนที่ข้อความ . หากผู้ใช้พิมพ์ 3 หรือ D แล้วจะพิมพ์ กำลังลบข้อความ . มันจะพิมพ์ ลองอีกครั้ง สำหรับการป้อนข้อมูลอื่น ๆ

#!/bin/bash
โยนออก 'เลือกตัวเลือกใดก็ได้จากเมนู:'
อ่านคำตอบ
กรณี $answer ใน
1 |NS) โยนออก 'กำลังค้นหาข้อความ';;
2 |NS) โยนออก 'การแทนที่ข้อความ';;
3 |NS) โยนออก 'กำลังลบข้อความ';;
*) โยนออก 'ลองอีกครั้ง.';;
esac

เรียกใช้สคริปต์

$ทุบตีmenu.bash

บทสรุป

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

สำหรับข้อมูลเพิ่มเติมตรวจสอบวิดีโอนี้: