Clear
Lead Graphic Papers

คำสั่งที่เกี่ยวข้องกับการประมวลผลข้อความในระบบปฏิบัติการ UNIX

ผู้เขียน: วิศัลย์ ประสงค์สุข
วันที่เผยแพร่: 15 พ.ย. 2554
ปรับปรุงล่าสุด: 15 พ.ย. 2554

Share on Facebook Share on Twitter Share on Google+

เนื่อง จากระบบปฏิบัติการ UNIX พิจารณาทรัพยากรทุกอย่างบนระบบในรูปแบบของไฟล์ ไม่เว้นแม้กระทั่งฮาร์ดแวร์ หรือโปรเซสที่รันอยู่ในหน่วยความจำ [1] การแก้ไขการตั้งค่าระบบส่วนใหญ่จึงทำในไฟล์การตั้งค่า (Configuration file) ในบางครั้งไฟล์เหล่านี้ก็ความยาวมากทำให้ไม่สะดวกในการค้นหาสิ่งที่ต้องการ แก้ไข แต่ปัญหานี้สามารถแก้ไขได้ หากผู้ใช้มีความสามารถในการใช้งานคำสั่งที่เกี่ยวข้องกับการประมวลผลข้อความ (Text Processing)

ในบทความนี้จะยกตัวอย่างการใช้งานคำสั่งที่เกี่ยวข้องกับการประมวลข้อความที่ ใช้บ่อย เพื่อให้ผู้เริ่มต้นหรือผู้สนใจสามารถใช้งานคำสั่งที่เกี่ยวข้องกับการ ประมวลผลข้อความขั้นพื้นฐานได้ โดยใช้ไฟล์ /etc/passwd ในการสาธิตวิธีใช้งานคำสั่งต่าง ๆ ไฟล์ /etc/passwd นี้เป็นไฟล์ของระบบ UNIX ซึ่งเก็บข้อมูลบัญชีชื่อผู้ใช้ของระบบ UNIX

ตัวอย่างคำสั่งที่เกี่ยวข้องกับการประมวลผลข้อความที่ใช้งานบ่อย

head และ tail

head เป็นคำสั่งที่ใช้แสดงเนื้อหาส่วนต้นของไฟล์ (โดยค่าตั้งต้นจะแสดง 10 บรรทัดแรก) ส่วนมากจะใชักับไฟล์หรือผลลัพธ์ที่เกิดจากการทำงานจากคำสั่งอื่น โดยมีรูปแบบคือ head [option] [filename] มีตัวอย่างการใช้งานดังนี้

คำสั่ง ความหมาย
head /etc/passwd แสดง 10 บรรทัดแรกของไฟล์ /etc/passwd
head -c10 /etc/passwd แสดง 10 ไบต์แรกของไฟล์ /etc/passwd
head -n5 /etc/passwd แสดง 5 บรรทัดแรกของไฟล์ /etc/passwd

tail เป็นคำสั่งที่คล้ายกับคำสั่ง head ใช้แสดงเนื้อหาส่วนท้ายของไฟล์ (โดยค่าตั้งต้นจะ แสดง 10 บรรทัดสุดท้าย) นอกจากนี้ผู้ใช้สามารถใช้คำสั่ง tail เพื่อเฝ้าดูไฟล์ที่มีการเปลี่ยนแปลงตลอดเวลาเช่น Log file เป็นต้น สามารถใช้งานคำสั่งโดยมีรูปแบบคือ tail [option] [filename] มีตัวอย่างการใช้งานดังนี้

คำสั่ง ความหมาย
tail /etc/passwd แสดง 10 บรรทัดสุดท้ายของไฟล์ /etc/passwd
tail -c10 /etc/passwd แสดง 10 ไบต์สุดท้ายของไฟล์ /etc/passwd
tail -f file.log แสดง 10 บรรทัดสุดท้ายขณะที่ไฟล์มีการเปลี่ยนแปลง
tail -n5 /etc/passwd แสดง 5 บรรทัดสุดท้ายของไฟล์ /etc/passwd

more และ less

ทั้ง สองเป็นคำสั่งที่ใช้แสดงเนื้อหาของไฟล์ทีละหน้าจอ มีประโยชน์มากหากไฟล์นั้นมีความยาวเกินกว่าที่จะแสดงได้ในหน้าจอเดียว คำสั่ง less พัฒนาเพิ่มเติมจากคำสั่ง more จึงมีความสามารถมากกว่าเช่น แสดงข้อความได้โดยไม่ต้องรอให้ระบบปฏิบัติการโหลดทั้งไฟล์ไปไว้ที่หน่วยความ จำ เป็นต้น สามารถใช้คำสั่งโดยมีรูปแบบ more [filename] และ less [filename] เช่น more /etc/passwd

echo

เป็น คำสั่งที่ใช้แสดงข้อความที่พิมพ์เข้าไปในเครื่องคอมพิวเตอร์ออกทางหน้าจอ เช่น หากต้องการแสดงคำว่า “hello world” ออกทางหน้าจอ สามารถใช้งานคำสั่งโดยมีรูปแบบคือ echo [option] [text] มีตัวอย่างการใช้งานดังนี้

คำสั่ง ความหมาย
echo “hello world” แสดงข้อความ hello world ทางหน้าจอ เมื่อแสดงข้อความแล้วจะขึ้นบรรทัดใหม่
echo -n “hello world” ไม่ต้องขึ้นบรรทัดใหม่เมื่อแสดงข้อความ hello world จบ
echo -e “hello \tworld” อนุญาตให้ใช้ Escape Character (ตัวอักษรพิเศษที่ทำให้ตัวอักษรที่ตามมามีความหมายอื่น ส่วนใหญ่มักใช้ตัวอักษรพิเศษคือ \ ) เช่น
\t หมายถึง เลื่อนตำแหน่งไปทางขวา 1 ย่อหน้า
\n หมายถึง ขึ้นบรรทัดใหม่
\\ หมายถึง เติมเครื่องหมาย \
\” หมายถึง เติมเครื่องหมาย “ เป็นต้น

cat

คำสั่ง cat แสดงเนื้อหาทั้งหมดของไฟล์ที่ระบุ สามารถใช้งานคำสั่งโดยมีรูปแบบการใช้งานคือ cat [option] [file] มีตัวอย่างการใช้งานดังนี้

คำสั่ง ความหมาย
cat /etc/passwd แสดงเนื้อหาทั้งหมดของไฟล์ /etc/passwd
cat -b /etc/passwd แสดงเนื้อหาทั้งหมดของไฟล์โดยจะแสดงเลขบรรทัดซึ่งไม่นับรวมบรรทัดว่าง
cat -n /etc/passwd แสดงเนื้อหาทั้งหมดของไฟล์โดยจะแสดงเลขบรรทัดซึ่งนับรวมบรรทัดว่างด้วย
cat -E /etc/passwd แสดงคำสุดท้ายของแต่ละบรรทัดของเนื้อหาในไฟล์

Pipe

สัญลักษณ์ “|” เรียกว่า Pipe ทำหน้าที่นำผลลัพธ์ของคำสั่งแรกไปเป็นข้อมูลนำเข้าของคำสั่งที่สอง ยกตัวอย่างเช่น หากผู้ใช้ต้องการแสดงเลขบรรทัด เนื้อหาของไฟล์ /etc/passwd ทีละหน้าจอ สามารถใช้โปแกรม cat ร่วมกับคำสั่ง more ได้เช่น cat -n /etc/passwd | more เป็นต้น

wc

คำ สั่ง wc ใช้ในการนับจำนวนคำ จำนวนบรรทัด หรือ จำนวนไบต์ ของไฟล์ที่ระบุ สามารถนำไปประยุกต์ใช้ได้อย่างกว้างขวางเช่น หากต้องการทราบจำนวนผู้ใช้ภายในเครื่องคอมพิวเตอร์ สามารถใช้คำสั่งนี้เพื่อนับจำนวนบรรทัดของไฟล์ /etc/passwd ได้ เป็นต้น สามารถใช้คำสั่งโดยมีรูปแบบคือ wc [option] [filename] มีตัวอย่างการใช้งานดังนี้

คำสั่ง ความหมาย
wc /etc/passwd แสดงจำนวนบรรทัด จำนวนคำ จำนวนไบต์ จากไฟล์ /etc/passwd
wc -l /etc/passwd แสดงจำนวนบรรทัดของไฟล์ /etc/passwd
wc -w /etc/passwd แสดงจำนวนคำของไฟล์ /etc/passwd
wc -c /etc/passwd แสดงจำนวนไบต์ของไฟล์ /etc/passwd

Redirection

หลาย ครั้งเมื่อผลลัพธ์ที่ได้จากการทำงานของคำสั่งมีความยาวมาก ทำให้ไม่สะดวกที่จะอ่านที่หน้าจอ ระบบปฏิบัติการ UNIX จึงมีวิธีเปลี่ยนการแสดงผลลัพธ์ให้ไปยังที่ซึ่งผู้ใช้ต้องการเพื่อใช้ในการ ตรวจสอบภายหลัง เช่น อาจจะนำผลลัพธ์มาเขียนเป็นไฟล์ หรือจะให้พิมพ์ออกมาทางเครื่องพิมพ์ เป็นต้น เรียกวิธีการเช่นนี้ว่า Redirection ซึ่งนอกจากจะเปลี่ยนการแสดงผลลัพธ์จากการทำงานของคำสั่งได้แล้ว ยังสามารถใช้เพื่อเปลี่ยนวิธีนำข้อมูลเข้าสู่คำสั่งได้ด้วย เช่น สามารถกำหนดให้ไฟล์เป็นข้อมูลนำเข้าของคำสั่งได้แทนที่จะนำเข้าข้อมูลผ่าน แป้นพิมพ์แบบทั่วไป เป็นต้น ในการใช้งาน ผู้ใช้จะใช้สัญลักษณ์ “<” เพื่อแทนการเปลี่ยนวิธีนำเข้าข้อมูล และใช้ “>” แทนการเปลี่ยนวิธีแสดงผลลัพธ์
แต่ ก่อนจะเริ่มสาธิตการใช้งาน Redirection ผู้ใช้ควรทำความเข้าใจกับ Standard Streams เพื่อทราบหลักการทำงานของคำสั่งในระบบ UNIX เบื้องต้นก่อน

Standard Streams

การ ไหลของข้อมูลจากที่หนึ่งไปยังอีกที่หนึ่ง เรียกว่า Streams โดยทั่วไปการไหลของข้อมูลในระบบ UNIX มี 3 ประเภทดังรูปที่ 1 เรียกการไหลของข้อมูลเหล่านี้ว่า Standard Streams ประกอบไปด้วย

1. Standard Input (stdin) เป็นข้อมูลที่นำเข้าสู่คำสั่ง ซึ่งโดยทั่วไปมี Terminal (ส่วนที่ทำหน้าที่ติดต่อระหว่างผู้ใช้กับคอมพิวเตอร์) เป็นแป้นพิมพ์ มี File descriptor เป็น 0

2. Standard Output (stdout) เป็นผลลัพธ์ที่ได้จากการประมวลผลคำสั่ง ซึ่งโดยทั่วไปมี Terminal เป็น หน้าจอคอมพิวเตอร์ มี File descriptor เป็น 1

3. Standard Error (stderr) เป็นผลลัพธ์ที่ได้จากการประมวลผลคำสั่ง เมื่อมีการทำงานผิดพลาด ซึ่งโดยทั่วไปมี Terminal เป็น หน้าจอคอมพิวเตอร์ มี File descriptor เป็น 2

รูปที่ 1 Standard Streams [2]

ตรงจุดนี้น่าจะมีผู้สงสัยไม่น้อยเกี่ยวกับ File descriptor ซึ่งสามารถอธิบายอย่างง่ายคือ ในขณะที่ระบบปฏิบัติการ UNIX เปิดไฟล์ที่ต้องการใช้งาน ระบบจะกำหนดค่าตัวเลขให้กับไฟล์นั้นเพื่อให้คำสั่งต่าง ๆ เรียกใช้งานเมื่อต้องการอ่านหรือเขียนข้อมูลในไฟล์นั้น เลขที่ระบบปฏิบัติการกำหนดให้ไฟล์นี้เรียกว่า File Descriptor โดยทั่วไประบบ UNIX จะเปิดไฟล์ทั้งสามที่กล่าวไว้ข้างต้นเพื่อให้คำสั่งต่าง ๆ เรียกใช้งาน [3] ผู้ใช้สามารถใช้งาน Redirection ได้ดังนี้

ตัวอย่างการใช้ข้อมูลจากไฟล์เป็นข้อมูลนำเข้า
cat < /etc/passwd
คำสั่งนี้เป็นการกำหนดให้ไฟล์ /etc/passwd เป็นข้อมูลนำเข้าของคำสั่ง cat

ตัวอย่างการเปลี่ยนวิธีแสดงผลลัพธ์ที่ได้จากคำสั่งไปสู่ไฟล์
echo “hello world” > sample1
คำสั่งนี้เป็นการกำหนดผลลัพธ์ของคำสั่ง echo ไว้ที่ไฟล์ sample1

ตัวอย่างการใช้ข้อมูลจากไฟล์เป็นข้อมูลนำเข้า และเปลี่ยนวิธีการแสดงผลลัพธ์ไปสู่ไฟล์
cat < /etc/passwd > sample2
คำสั่งนี้เป็นการกำหนดให้ไฟล์ /etc/password เป็นข้อมูลนำเข้าของคำสั่ง cat และนำผลลัพธ์เขียนลงในไฟล์ sample2

การ ใช้งาน Redirection นั้นมีประโยชน์อย่างมากเพราะช่วยให้ผู้ใช้ทำงานได้สะดวกมากขึ้น เช่นในบางกรณีหากชุดคำสั่งที่ใช้งานเกิดข้อผิดพลาด ผู้ใช้สามารถใช้ Redirection ร่วมกับ stdout และ stderr เพื่อเปลี่ยนการแสดงผลข้อความแจ้งข้อผิดพลาด มาเขียนลงไฟล์ดังรูปที่2

รูปที่ 2 การใช้ Redirection กับ stdout และ stderr

  • บรรทัดแรกใช้คำสั่ง more x แต่ไม่มีไฟล์ดังกล่าวอยู่ในไดเรกทอรีที่ระบุ ดังนั้นในบรรทัดที่สอง ระบบจึงแจ้งข้อผิดพลาด
  • ทำการเปลี่ยนวิธีการแสดงผลลัพธ์ให้เขียนลงในไฟล์ sample3
  • เมื่อสั่ง cat sample3 พบว่าไม่มีข้อความใด ๆ ปรากฏ เนื่องจากในการสั่ง more x ไม่ได้มีผลลัพธ์ใน stdout นั่นเอง
  • ทำการสั่ง more x > sample3 2>&1
    • ซึ่งตัวเลข 1 และ 2 คือ File descriptor ของ stdout และ stderr ตามลำดับ
    • 2>&1 หมายความว่า ให้ระบบนำผลลัพธ์ของ stderr เก็บไว้ที่เดียวกันกับ stdout
  • สั่ง cat sample3 อีกครั้งจะพบว่ามีข้อความแจ้งข้อผิดพลาดอยู่ภายในไฟล์

grep

grep เป็นคำสั่งที่ใช้ในการค้นหารูปแบบของข้อความในไฟล์หรือไดเรกทอรี โดย grep จะอ่านข้อมูลในไฟล์ทีละบรรทัดมาเปรียบเทียบกับรูปแบบที่ผู้ใช้กำหนด [4] ผู้ใช้สามารถใช้ grep โดยมีรูปแบบ grep [option] [PATTERN] [FILE] ได้โดยมีรูปแบบดังนี้

คำสั่ง ความหมาย
grep “root” /etc/passwd ค้นหาข้อความ “root” ในไฟล์ /etc/passwd หากพบจะแสดงข้อความของบรรทัดที่พบและ highlight ข้อความ ออกมาที่หน้าจอ
grep -n “root” /etc/passwd ค้นหาข้อความ “root” ในไฟล์ /etc/passwd หากพบจะแสดงข้อความและหมายเลขของบรรทัดที่พบและ highlight ข้อความ ออกมาที่หน้าจอ
grep -v “root” /etc/passwd highlight ข้อความที่ไม่ตรงกับ “root”
grep -i “ROOT” /etc/passwd ค้นหารูปแบบข้อความโดยไม่สนใจว่าจะเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก (case insensitive)
grep -A3 “root” /etc/passwd -A[number] เป็นการสั่งให้ grep แสดงข้อความหลังพบรูปแบบที่ตรงกับการค้นหา เช่น -A3 แสดง 3 บรรทัดหลังบรรทัดที่พบ “root”
Regular Expression

grep รองรับ Regular Expression 3 ประเภท คือ Basic (BRE), Extended (ERE), Perl (PRCE) [5] ทั้งสามประเภทมีวิธีใช้แตกต่างกัน โดยที่ grep จะใช้ BRE เป็นค่าตั้งต้น หากผู้ใช้ต้องการใช้ ERE หรือ PRCE สามารถใส่ option “-E” หรือ “-P” ตามลำดับ ผู้ใช้สามารถศึกษา Regular Expression ได้จากแหล่งข้อมูลในส่วนอ้างอิง หรือจากแหล่งอื่นๆ เพิ่มเติมได้ ในตารางต่อไปนี้จะยกตัวอย่าง BRE ที่ใช้บ่อย พร้อมยกตัวอย่างวิธีใช้งานร่วมกับ grep โดยใช้ไฟล์ sample4 ซึ่งมีข้อความ “abcdefghijklmnopqrstuvwxyz12345” อยู่

ตารางตัวอย่าง Regular Expression

สัญลักษณ์ คำอธิบาย

.

จุด(.) หมายถึง อักขระใดก็ได้ 1 อักขระ

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep . sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

[abc]

เป็น การประกาศกลุ่มอักขระในตัวอย่าง grep จะนำอักขระที่ประกาศออกไปค้นหาทีละตัวจนกว่าจะครบนอกจะประกาศทีละตัวอักษร แล้ว ยังสามารถประกาศเป็นช่วงอักขระได้ เช่น [a-c] จะประกอบเหมือนกับประกาศ [abc]

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep [abc] sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

[^abc]

จากตัวอย่างอักขระที่นอกเหนือจาก a,b,c จะถูก grep นำไปใช้ในการค้นหา

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep [^abc] sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

^

เป็นสัญลักษณ์ บอกถึงอักขระแรกของบรรทัด เช่น หากต้องการค้นหาบรรทัดที่ขึ้นต้นด้วยตัวอักษร a จะใช้รูปแบบ ^a

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep ^a sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

$

เป็นสัญลักษณ์ บอกถึงอักขระสุดท้ายของบรรทัด เช่น หากต้องการค้นหาบรรทัดที่จบด้วยตัวเลข5 จะใช้รูปแบบ 5$

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep 5$ sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

*

ใช้เมื่อต้องการกำหนดปริมาณ โดย * มีค่าปริมาณคือ มากกว่าหรือเท่ากับ 0

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep abc.*j sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

[[:alpha:]]

ใช้ประกาศรูปแบบกลุ่มตัวอักษรทั้งหมดไม่ว่าจะอักษรใหญ่หรืออักษรเล็ก เหมือนกับการประกาศรูปแบบกลุ่มอักษร [A-Za-z]

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep [[:alpha:]] sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

[[:alnum:]]

ใช้ประกาศรูปแบบกลุ่มตัวอักษรทั้งหมดไม่ว่าจะอักษรใหญ่หรืออักษรเล็กและตัวเลข เหมือนกับการประกาศรูปแบบกลุ่มอักษร [A-Za-z0-9]

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep [[:alnum:]] sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

[[:digit:]]

ใช้ประกาศรูปแบบกลุ่มตัวเลข เหมือนกับการประกาศรูปแบบกลุ่มอักษร [0-9]

ตัวอย่างการใช้งานร่วมกับ grep
คำสั่ง: grep [[:digit:]] sample4
ผลลัพธ์: abcdefghijklmnopqrstuvwxyz12345

อ้างอิง

[1] http://www.thaicert.or.th/papers/normal/2011/pp2011no0003.html
[2] http://en.wikipedia.org/wiki/File:Stdstreams-notitle.svg
[3] http://www.livefirelabs.com/unix_tip_trick_shell_script/june_2003/06092003.htm
[4] http://www.regular-expressions.info/grep.html
[5] http://www.gnu.org/s/grep/manual/html_node/Regular-Expressions.html#Regular-Expressions

Clear