Searching Commands

find, grep คำสั่งค้นหาข้อความและไฟล์ด้วยชุด Regular Expressions

find

การค้นหาไฟล์ในระบบปฏิบัติการลีนุกซ์สามารถทำได้หลายวิธี หนึ่งในคำสั่งที่ได้รับความนิยมคือคำสั่ง find เพราะมีความยืดหยุ่นสูงในการค้นหาไฟล์แต่ละชนิดดังตารางแสดงพารามิเตอร์ (parameter) เพื่อใช้ระบุชนิดไฟล์ที่ต้องการค้นหา

ตารางสัญลักษณ์บอกชนิดไฟล์

สัญลักษณ์
ชนิดไฟล์

f

ไฟล์ทั่วไป

d

ไดเรกทอรี

b

block

c

character

p

pipe

l

Symbolic link

s

Socket

ในกรณีที่ต้องการระบุให้ค้นหาเฉพาะไฟล์ทั่วไป (f) หรือ ไดเรกทอรี (d) สามารถใช้ตัวเลือก -type เพื่อระบุประเภทได้ดังตัวอย่างข้างล่าง

$ ls -l
total 28
-rw-r--r-- 1 student student   53 2013-08-21 05:16 error.log
-rwxr-xr-x 1 student student 8497 2013-08-21 06:05 hello
-rw-r--r-- 1 student student   92 2013-08-21 06:05 hello.c
drwxr-xr-x 2 student student 4096 2013-09-17 18:03 out
-rw-r--r-- 1 student student   57 2013-08-21 05:16 result.txt


$ find . -type f
./error.log
./result.txt
./.my_hidden_file
./hello
./hello.c


$ find . -type d
.
./.my_hidden_directory
./out

ในกรณีที่ต้องการค้นหาไฟล์หรือไดเรกทอรีที่ถูกซ่อนอยู่

เนื่องจากระบบไฟล์ภายใต้ระบบปฏิบัติการลีนุกซ์จะเป็นแบบ case sensitive (สนใจตัวพิมพ์เล็ก-พิมพ์ใหญ่) ดังนั้นในการค้นหาไฟล์ที่ใกล้เคียงทั้งหมดโดยไม่สนใจกรณี case sensitive สามารถระบุโดยการใช้ -iname เข้าไปดังตัวอย่างข้างล่าง

การระบุระดับความลึกของชั้นไดเรกทอรีในการค้นหา สามารถทำได้โดยการใช้ -mindepth [level] และ -maxdepth [level] ตัวอย่างเช่น ต้องการค้นหาตั้งแต่ไดเรกทอรี root (level 1) และลึกลงไปอีก 2 ชั้น (level 2 - level 3) สามารถใช้คำสั่งดังนี้

เมื่อต้องการระบุว่าให้ค้นหาไฟล์ที่อยู่เฉพาะระดับความลึกที่ 2 ถึง 4 (level 2 - level 4)

การค้นหาด้วยคำสั่ง find แต่ละครั้ง สามารถตั้งชุดคำสั่งพิเศษหลังตัวเลือก -exec ในกรณีที่เจอไฟล์ตามที่ต้องการค้นหา ตัวอย่างเช่นให้ทำการเช็คค่า checksum ไฟล์ที่เจอด้วยคำสั่ง md5sum

ถ้าต้องการระบุการค้นหาตามสิทธิ์ของไฟล์นั้น (file permission) สามารถใช้ -perm ได้ดังตัวอย่างข้างล่าง

หรือระบุเป็นเลขฐานแปด (Octal)

งานด้านระบบสมองกลฝังตัวขนาดของไฟล์ข้อมูลค่อนข้างเป็นประเด็นที่ต้องให้ความสนใจ เนื่องจากพื้นที่เก็บข้อมูลมีขนาดจำกัด ดังนั้นการนำคำสั่ง find มาประยุกต์ใช้เพื่อค้นหาไฟล์ตามขนาดไฟล์ที่ต้องการจึงมีความสำคัญเช่นกัน ดังตัวอย่างต่อไปนี้

เมื่อต้องการค้นหาไฟล์ที่มีขนาดใหญ่ 5 อันดับแรก

หรือขนาดเล็กสุด 5 อันดับแรก แต่ไม่ต้องการรวมไฟล์ที่มีขนาดศูนย์ไบต์ (Empty file)

ในกรณีที่ต้องการระบุขนาดไฟล์ (byte) อย่างชัดเจน สามารถใช้ -size [byte] ดังตัวอย่างข้างล่าง

นักพัฒนาสามารถสร้างคำสั่งเฉพาะด้วย alias เพื่อความสะดวกในการค้นหาไฟล์ขนาดที่ต้องการ เพื่อลบทิ้ง ดังตัวอย่างข้างล่าง

นอกจากนั้นถ้าต้องการค้นหาไฟล์โดยดูจากเวลาของไฟล์ที่ถูกเข้าถึง (Access time) ถูกเปลี่ยนแปลงข้อมูลภายใน (Modification time) หรือ มีการเปลี่ยนแปลงไอโหนด/สถานะ (Change time) สามารถระบุตัวเลือกดังรายละเอียดในตารางข้างล่าง

ตารางตัวเลือกการเข้าถึงไฟล์ของคำสั่ง find

ตัวเลือก
คำอธิบาย

--- Access Time ---

amin m

เวลา m นาทีที่ผ่านมา ที่ไฟล์ถูกเข้าถึง

atime d

เวลา d*24 ชั่วโมงที่ผ่านมา ที่ไฟล์ถูกเข้าถึง

--- Modification Time ---

mmin m

เวลา m นาทีที่ผ่านมา ที่ไฟล์ถูกเปลี่ยนแปลงข้อมูลภายใน

mtime d

เวลา d*24 ชั่วโมงที่ผ่านมา ที่ไฟล์ถูกเปลี่ยนแปลงข้อมูลภายใน

--- Change Time ---

cmin m

เวลา m นาทีที่ผ่านมา ที่ไฟล์ถูกเปลี่ยนสถานะหรือค่าไอโหนด

ctime d

เวลา d*24 ชั่วโมงที่ผ่านมา ที่ไฟล์ถูกสถานะหรือค่าไอโหนด

ค้นหาไฟล์ภายในไดเรกทอรี unix ที่มีการถูกแก้ไขข้อมูลภายในไฟล์ เมื่อ 10 นาทีที่ผ่านมา

ค้นหาไฟล์ภายในไดเรกทอรี unix ที่มีการถูกเปลี่ยนแปลงสิทธิ์ไฟล์เมื่อ 10 นาทีที่ผ่านมา

ในกรณีที่ไม่ต้องการให้แสดงผลไฟล์ที่ถูกซ่อน (hidden file) ในผลลัพธ์ของการค้นหา สามารถใช้ -regex ดังตัวอย่างข้างล่าง

ในการค้นหาไฟล์ที่ต้องการบางครั้ง ถ้าผู้ใช้ต้องการตั้งเงื่อนไขแยกเป็น 2 ส่วนคือ ตรวจสอบสิทธิ์ และตรวจสอบขนาดไฟล์ สามารถเขียนให้อยู่ในรูปแบบดังตัวอย่างข้างล่าง

grep

คำสั่ง grep (Generalized Regular Expression Parser) เป็นคำสั่งที่มีการใช้งานบ่อยครั้งตั้งแต่ระดับคอมพิวเตอร์ตั้งโต๊ะจนไปถึงบอร์ดสมองกลฝังตัวที่มีระบบปฏิบัติการลีนุกซ์อยู่ภายในโดยหน้าที่ของคำสั่งนี้คือการค้นหาข้อความที่อยู่ภายในไฟล์ที่ต้องการตามเงื่อนไขที่ตั้งไว้ ตัวอย่างเช่น

ตารางตัวดำเนินการสำหรับคำสั่ง grep

ตัวดำเนินการ
คำอธิบาย

?

เจออย่างน้อย 1 ตัวอักขระ

*

เจออย่างน้อย 0 หรือ มากกว่าหลายตัวอักขระ

+

เจออย่างน้อย 1 หรือ มากกว่าหลายตัวอักขระ

^

ค้นหาเฉพาะขึ้นต้นบรรทัด

$

ค้นหาเฉพาะท้ายบรรทัด

[ ]

ค้นหาตัวอัขระใดตัวอักขระหนึ่งที่อยู่ใน [ ]

{n}

เจอซ้ำเป็นจำนวน n ครั้ง

{n,}

เจอซ้ำเป็นจำนวนตั้งแต่ n ครั้ง หรือมากกว่า

{n,m}

เจอซ้ำเป็นจำนวนตั้งแต่ n ครั้งจนถึง m ครั้้ง

\char

ค้นหาตัวอักขระ char

-E ‘pattern1 .* pattern2

ค้นหา pattern1 และ pattern2

-E ‘pattern1 | pattern2

ค้นหา pattern1 หรือ pattern2

ตัวอย่างการใช้คำสั่ง grep เพื่อค้นหาคำจากผลลัพธ์ของคำสั่ง ls -al

ในกรณีที่จะใช้ตัวดำเนินการ “+” จำเป็นต้องใช้โปรแกรมรุ่นใหม่ของโปรแกรม grep คือโปรแกรม egrep (Extended Grep) ดังตัวอย่างข้างล่าง

ในกรณีที่ต้องการค้นหาตัวเลขตามจำนวนหลักที่ต้องการ สามารถใช้ตัวดำเนินการ [ ] และ {n} ดังตัวอย่างข้างล่าง

ถ้าต้องการค้นหาที่มีตัวเลขตั้งแต่ 7 หลักขึ้นไปจะใช้ตัวดำเนินการ {m, } ดังตัวอย่างข้างล่าง

การค้นหาข้อมูลภายในไฟล์ log นักพัฒนาสามารถทำการวิเคราะห์เบื้องต้นได้ด้วยตัวดำเนินการ -E ‘pattern1 | pattern2’ ดังตัวอย่างของข้อมูล log ข้างล่างนี้

สามารถใช้คำสั่ง grep เพื่อค้นหาข้อมูลภายในได้ 4 รูปแบบ ได้แก่

เมื่อต้องการค้นหาคำที่อยู่ตำแหน่งต้นบรรทัด จะใช้ “^” นำหน้าคำที่ต้องการค้นหา หรือคำที่อยู่ตำแหน่งปลายบรรทัด จะใช้ “$” ต่อท้ายคำที่ต้องการค้นหา ดังตัวอย่างข้างล่าง

การค้นหาคำที่มีอักขระพิเศษอยู่ด้วยนั้น จะต้องใช้ตัวดำเนินการ \ นำหน้าตัวอักขระพิเศษเสมอ ดังตัวอย่างข้างล่าง

ตารางตัวดำเนินการเพิ่มเติมสำหรับคำสั่ง grep

Operator
Description

[:digit:]

เฉพาะตัวเลขตั้งแต่ 0 ถึง 9

[:alnum:]

ทั้งตัวอักษร A ถึง Z หรือ a ถึง z และตัวเลขตั้งแต่ 0 ถึง 9

[:alpha:]

ตัวอักษร A ถึง Z หรือ a ถึง z

[:blank:]

เฉพาะช่องว่าง (Space) และแท๊ป (TAB) เท่านั้น

จากตารางข้างต้น เป็นการระบุตัวอักขระในแต่ละประเภทเพื่อให้การค้นหามีประสิทธิภาพมากขึ้น ดังตัวอย่างการใช้งานดังนี้

การรวมคำสั่งเข้าด้วยกัน ด้วยสัญญลักษณ์ที่เรียกว่า Pipe (|) โดยเอาท์พุตของคำสั่งแรกจะเป็นอินพุตของคำสั่งถัดไป จนกระทั่งถึงคำสั่งสุดท้ายที่จะแสดงผลลัพธ์สู่หน้าจอ ดังตัวอย่างการใช้ดังนี้

$ ls <ไดเรกทอรี> | grep <คำค้นหา>

Last updated

Was this helpful?