Linux Shell : การใช้คำสั่ง grep เพื่อค้นหาคำในไฟล์

วิธีการทำงานของคำสั่ง grep คือจะอ่านไฟล์ที่เราต้องการค้นหาทีละบรรทัด แล้วดูว่าตรง (match) กับคำหรือรูปแบบที่เราต้องการค้นหาหรือไม่ ซึ่งผลลัพธ์โดยดีฟอลต์ที่ได้จากการรันคำสั่ง จะแสดงผลลัพธ์เป็นบรรทัดต่างๆ ที่ตรงกับคำหรือรูปแบบนั้นๆ

วิธีการใช้คำสั่ง

$ grep [OPTION] [FILE]

เราจะทดลองใช้คำสั่ง grep กับไฟล์ /etc/passwd เพื่อหาข้อมูลที่ต้องการ โดยไฟล์ /etc/passwd นี้จะมีรูปแบบการเก็บแยกเป็นบรรทัดอยู่แล้ว

ตัวอย่างไฟล์ /etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...

เริ่มต้นการใช้คำสั่ง grep
เริ่มต้นสมมติว่าเราต้องการหาคำว่า root ในไฟล์ /etc/passwd ว่ามีอยู่ในบรรทัดใดบ้าง สามารถทำได้ดังนี้

$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

ผลลัพธ์ที่ได้จะแสดงบรรทัดที่มีคำว่า root อยู่ด้วย

แสดงเลขบรรทัด (-n)
สามารถแสดงเลขบรรทัดในผลลัพธ์โดยการใส่ option -n ในคำสั่ง grep

$ grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
12:operator:x:11:0:operator:/root:/sbin/nologin

ผลลัพธ์จะมีเลขที่บรรทัดกำกับมาด้วย ในที่นี้ คือ 1 และ 12 ก็คือบรรทัดที่ 1 และ 12 นั่นเอง

ไม่แสดงบรรทัดที่มีคำที่ต้องการ (-v)
เช่นเราไม่ต้องการบรรทัดที่มีคำว่า root ก็สามารถทำได้โดยเพิ่ม option -v ลงไป

$ grep -v root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
...

ผลลัพธ์ที่ได้จะแสดงบรรทัดอื่นๆ ที่ไม่มีคำว่า root

ระบุรูปแบบในการค้นหา (-E)
ในคำสั่ง grep เราสามารถระบุรูปแบบ (pattern) ในการค้นหาได้หลายแบบ แบบที่นิยมกันอย่างหนึ่งคือใช้ REGULAR EXPRESSION ในที่นี้ต้องใส่ option -E โดยสามารถใช้ REGULAR EXPRESSION เช่นเดียวกับเวลาเราใช้ในการเขียนโปรแกรมภาษาต่างๆ

ตัวอย่างเช่นหาบรรทัดที่ขึ้นต้นด้วยตัวอักษร s

$ grep -E ^s /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
smolt:x:497:493:Smolt:/usr/share/smolt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin

จากตัวอย่างเราใช้เคื่องหมาย ^ เพื่อระบุว่าตัวอักษรที่ตามมานั้นเป็นตัวอักษรเริ่มต้นของบรรทัด

ค้นหาจากหลายๆ ไฟล์
บางครั้งมีหลายไฟล์ที่เราต้องการค้นหานั้น ก็สามารถทำได้โดยระบุชื่อไฟล์เป็น * ได้

เช่นค้นหาคำว่า root จากทุกไฟล์ใน /etc/

$ grep root /etc/*
/etc/aliases:postmaster:     root
/etc/aliases:bin:            root
...
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
...
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/passwd-:root:x:0:0:root:/root:/bin/bash
...
/etc/rc.sysinit:             if [ "$owner" != root ]; then
/etc/rc.sysinit:if [ -f /etc/sysconfig/readonly-root ]; then
/etc/rc.sysinit:     . /etc/sysconfig/readonly-root
..

ผลลัพธ์ที่ได้จะแสดงชื่อไฟล์นำหน้าบรรทัดที่มีคำว่า root

ถ้าต้องการค้นหาภายใต้ sub-directory ย่อยๆ ลงไปด้วย ให้เพิ่ม option -r หลังคำสั่ง grep

ข้อมูลอ้างอิง

  • grep(1) manual page

4 thoughts on “Linux Shell : การใช้คำสั่ง grep เพื่อค้นหาคำในไฟล์”

  1. กำลังต้องการคำสั่งนี้พอดีเลยครับ เพราะไฟล์ผลลัพธ์มันใหญ่มากเลยต้องดึงข้อมูลที่ต้องการออกมา
    ขอบคุณมากครับ

Leave a Reply

Your email address will not be published.