Linux Shell : ดึงฟิลด์ที่ต้องการด้วยคำสั่ง cut

ในบทความนี้จะอธิบายการใช้คำสั่ง cut และเปรียบเทียบความเร็วที่ได้ ระหว่างการใช้คำสั่ง cut และการเขียนโปรแกรมเป็น PHP เพื่อดึงฟิลด์ที่ต้องการจากไฟล์ โดยใช้คำสั่ง time เพิ่มต่อหน้าการรันคำสั่งเพื่อแสดงผลเวลาที่ใช้ไปในการประมวลผล

โจทย์ : มีไฟล์ที่เป็นรูปแบบตัวหนังสือ (text-based) โดยในแต่ละบรรทัดเก็บข้อมูลเป็นฟิลด์ต่างๆ ที่อยู่ในรูปแบบเดียวกัน คั่นด้วยเครื่องหมาย , (comma) : (colon) หรืออื่นๆ

ความต้องการคือ ให้ดึงเฉพาะฟิลด์ที่ 3 ออกมาจากไฟล์ มาแสดงผลออกหน้าจอ

ตัวอย่างเช่นไฟล์ /etc/passwd ซึ่งจะเก็บข้อมูลต่างๆ ของบัญชีผู้ใช้งาน (User Account) บนระบบ UNIX/Linux โดยฟิลด์ต่างๆ จะคั่นด้วยเครื่องหมาย : colon

ตัวอย่างไฟล์ /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
...

ความหมายของแต่ละฟิลด์ใน /etc/passwd คือ
1. ชื่อบัญชีผู้ใช้ (User Account)
2. รหัสผ่าน (Password)
3. เลขประจำตัวผู้ใช้ (User ID)
4. เลขประจำตัวกลุ่ม (Group ID)
5. รายละเอียดเพิ่มเติมของผู้ใช้งาน เช่น ชื่อ นามสกุล (GECOS)
6. Home Directory ของผู้ใช้
7. Shell

การใช้คำสั่ง cut เพื่อดึงฟิลด์ที่ต้องการ
คำสั่ง cut ส่วนใหญ่แล้วจะมีทุก Linux ซึ่งสามารถเรียกใช้งานได้เลย ไม่ต้องลงโปรแกรมเพิ่มเติม โดยจะมีรูปแบบการรัน คือ

cut [OPTION]  [FILE]

ส่วนมากแล้วจะใช้อยู่สอง option คือ

  • –d เพื่อระบุอักขระที่ใช้คั่นแต่ละฟิลด์
  • -f ระบุลำดับที่ของฟิลด์ที่ต้องการแสดงผล เลข 1 หมายถึงฟิลด์แรก

[FILE] คือชื่อไฟล์

ตัวอย่างการใช้คำสั่ง cut เพื่อดึงฟิลด์ที่ 3 จากไฟล์ /etc/passwd โดยระบุ : (colon) เป็นตัวคั่นฟิลด์ (-d:) และดึงเฉพาะฟิลด์ที่ 3 (-f3)

$ time cut -d: -f3 /etc/passwd
0
1
2
3
...

real    0m0.011s
user    0m0.000s
sys     0m0.006s

ผลลัพธ์เมื่อใช้คำสั่ง time เพิ่มด้านหน้า จะมีส่วนของเวลาที่ใช้ในการรันคำสั่งด้วยต่อท้ายในผลลัพธ์ออกมาด้วย ในที่นี้เราจะสนใจค่าเวลาในบรรทัด real เท่านั้น ซึ่งใช้เวลา 0.011 วินาที ในการประมวลผลของคำสั่ง cut เพื่อดึงฟิลด์ที่ 3 ออกมาจากไฟล์

เขียนโปรแกรม PHP เพื่อดึงฟิลด์ที่ต้องการ
ตัวอย่างโปรแกรม PHP เพื่ออ่านไฟล์ /etc/passwd ออกมา และดึงเฉพาะฟิลด์ที่ 3 ที่คั่นด้วยเครื่องหมาย : (colon)

#!/usr/bin/php -q
<?php
$fh = fopen("passwd", "r");
while ($fields = fgetcsv($fh, 1000, ":")) {
    echo $fields[2] . "\n";
}
fclose($fh);
?>

หมายเหตุ ใน PHP เวลาระบุฟิลด์ที่ได้จาก fgetcsv ฟิลด์แรกจะเป็นหมายเลข 0

บันทึกโปรแกรมเป็นชื่อไฟล์ get_uid_from_passwd.php แล้วเปลี่ยนโหมดให้รันได้ (+x) จากนั้นใช้คำสั่ง time เพื่อจับเวลาในการรันคำสั่ง

$ chmod +x get_uid_from_passwd.php
$ time ./get_uid_from_passwd.php
0
1
2
3
...

real    0m0.170s
user    0m0.007s
sys     0m0.096s

จะได้ผลลัพธ์เหมือนกัน แต่เวลาที่ได้จะมากกว่า คือต้องใช้เวลา 0.17 วินาทีในการประมวลผล

ทดลองทำดูหลายๆ ครั้ง ผลลัพธ์ที่ได้การเขียนโปรแกรมภาษา PHP เพื่อดึงฟิลด์ที่ต้องการจะใช้เวลามากกว่าการใช้คำสั่ง cut

สรุปผลการทดลอง
บทความนี้เป็นบทความเริ่มต้นสำหรับแนะนำคำสั่งที่มีอยู่แล้วบน Linux เกือบทุกประเภท ทางทีมงาน SpaLinux.com จะพยายามรวบรวมคำสั่งที่เป็นประโยชน์ โดยจะตั้งชื่อหัวข้อเป็น Linux Shell เพื่อช่วยงานประจำวันของผู้ดูแลระบบ ซึ่งงานบางงานโดยเฉพาะการประมวลผลเกี่ยวกับไฟล์ที่เป็นตัวหนังสือ (text-based) เพื่อดึงข้อมลบางอย่างออกมานั้น ไม่จำเป็นต้องเขียนเป็นโปรแกรมเลย ไม่ว่าจะเป็น PHP, Perl, Python, ใช้แค่คำสั่งบน Shell เท่านั้น ทั้งประสิทธิภาพเวลาที่ใช้ในการประมวลผล ยังดีกว่า และเร็วกว่าอีกด้วย

Leave a Reply

Your email address will not be published.