December 26, 2011

vi: ค้นหาข้อความในเอกสาร

ในตอนที่ผ่านๆ มา เรารู้แล้วว่าสามารถค้นหาตัวอักษรในบรรทัดได้ด้วย [f] และ [t] ส่วนการค้นหาข้อความทั้งเอกสาร สามารถทำได้โดยเอา cursor ไปวางไว้ที่คำที่ต้องการค้นหา แล้วกด [*] หรือ [#]



สำหรับการค้นหาโดยคำที่ต้องการ จะใช้คำสั่งใน last line mode คือ /text [Enter] ครับ

การเลื่อนไปหาคำถัดไปทำได้โดยปุ่ม [n] ส่วนค้นหาย้อนกลับก็ใช้ [N]

สิ่งที่ต้องระวังคือ ข้อความที่ค้นหานี้ถือเป็น regex ครับ ซึ่ง
  • ., *, \, [, ], ^, $ ถือว่าเป็นอักขระ regex ถ้าต้องการใช้แทนอักขระทั่วไปให้ใส่ \ นำหน้า
  • +, ?, |, {, }, (, ) ถือว่าเป็นอักขระทั่วไป ถ้าต้องการใช้แบบ regex ให้ใส่ \ นำหน้า


การ wrap ข้อความที่จะค้นหาใช้ \< และ \> (ซึ่งจะเหมือนกับการใช้ [*] ครับ)

นอกจาก /text [Enter] แล้ว ยังมี ?text [Enter] อีก ซึ่งจะหาในทิศทางกลับกันนั่นเอง



การ replace คำจะใช้คำสั่ง last line mode คือ :s/find/replace/option เช่น


แต่ทั้งหมดนี้ จะเป็นการกระทำบนบรรทัดที่เราอยู่เพียงบรรทัดเดียวเท่านั้น การสั่งให้ทำกับส่วนต่างๆ ของเอกสารต้องเพิ่ม line modifier เข้าไปด้วย คือ

December 19, 2011

Shell: ธรรมชาติของโปรแกรมลินุกซ์ และการเปลี่ยนทิศทางข้อมูล

คำสั่งต่างๆ ของ Unix/Linux นั้นก็คือโปรแกรมโปรแกรมหนึ่ง ปรกติเราสามารถเรียกมันมาทำงานโดยพิมพ์ชื่อโปรแกรม (คำสั่ง) นั้นๆ ลงไป อย่างเช่นที่เคยทำมาแล้ว

เราสามารถใส่ argument ให้กับคำสั่งนั้นๆ โดย argument มีอยู่ 2 แบบ แบบแรกคือ option argument ซึ่งจะใช้เครื่องหมาย - นำหน้าคำสั่งที่เป็นตัวย่อ (สามารถใส่ได้หลายคำสั่ง) หรือใช้ -- นำหน้าคำสั่งเต็ม (เพื่อให้อ่านง่าย) ซึ่งแต่ละ option จะแยกกันด้วย space เช่น

ส่วน argument อีกแบบคืออันที่ไม่มีเครื่องหมาย - นำหน้า มันอาจหมายถึง path ของไฟล์สำหรับคำสั่งนั้นๆ หรือข้อความที่ส่งเข้าไปเป็น argument ให้ก็ได้

เนื่องจากคำสั่งเหล่านี้มีเยอะแยะมากมายตามแต่ละโปรแกรม สามารถหาอ่านเองได้ด้วยคำสั่ง man แล้วตามด้วยชื่อโปรแกรมที่อยากรู้ครับ (ออกโปรแกรมด้วยตัว q)



ธรรมชาติอีกอย่างของโปรแกรมเหล่านี้คือ บางโปรแกรมจะพิมพ์ผลลัพท์ออกมาทันทีแล้วกลับมาอยู่ที่ shell หลักเลย ส่วนบางโปรแกรมจะพาเราเข้าไปอยู่ใน shell ประจำโปรแกรมนั้นๆ พร้อมกับรอคำสั่งเพิ่มเติม อย่างเช่นโปรแกรม cat ที่จะทำการพิมพ์ข้อความซ้ำตามที่เราพิมพ์ป้อนให้มันครับ

วิธีการออกจากโปรแกรมเหล่านี้ก็แตกต่างกันออกไป (บางโปรแกรมก็มีคำสั่งเฉพาะสำหรับออกโปรแกรม) แต่ส่วนใหญ่แล้ว สามารถกด keyboard เพื่อป้อนคำสั่งให้หยุดโปรแกรมได้ ดังนี้
  1. [Ctrl]+[c] ส่งสัญญาณ keyboard interrupt บางโปรแกรมจะหยุดแค่งานย่อยๆ แต่ไม่ออกโปรแกรม
  2. [Ctrl]+[z] หยุดโปรแกรมชั่วคราว (เรียกทำงานต่อโดยคำสั่ง fg)
  3. [Ctrl]+[d] ออกโปรแกรม
อย่างไรก็ตาม โปรแกรมเหล่านี้บางโปรแกรมก็ไม่จำเป็นต้องเข้า shell ส่วนตัวเสมอไป ถ้าส่ง argument ให้กับโปรแกรมอย่างถูกต้อง เช่น โปรแกรม cat ที่เมื่อรับชื่อไฟล์เข้าไป จะพิมพ์ข้อความภายในไฟล์ออกมาทีละบรรทัด และสามารถรับไฟล์หลายไฟล์พร้อมกันได้



ในขั้นต้นเราอาจเห็นว่าโปรแกรมอย่าง cat นั้นดูไร้สาระ เพราะ shell ของโปรแกรมมันทำหน้าที่พิมพ์ซ้ำข้อความที่เราพิมพ์เข้าไป แต่เราจะได้ใช้ประโยชน์จากมันเมื่อรู้จักเทคนิค redirection ครับ

การ redirection คือการเปลี่ยนวิธีการใช้ input, output ซึ่งกระทำต่อ shell ของโปรแกรมย่อยๆ เหล่านั้น ซึ่งเปลี่ยนจากพิมพ์คำสั่งโดย keyboard มาเป็นใช้ไฟล์แทน อย่างเช่น

หรือรับ input เข้ามาเป็นไฟล์เสมือน (สร้าไฟล์เดี๋ยวนั้น แล้วจบไฟล์ด้วย keyword ที่ตั้งไว้)

ส่วนการจัดการกับ output จะเป็นการบันทึก output ที่ได้มาลงในไฟล์

อีกเทคนิคหนึ่งคือการ pipe มันคือการส่ง output จากโปรแกรมก่อนหน้า ไปให้โปรแกรมถัดไปจัดการต่อ เช่น ใช้โปรแกรม grep เพื่อหาคำที่ต้องการ

December 16, 2011

Shell: รู้จักกับไฟล์

ไฟล์ในระบบ Unix/Linux มีด้วยกัน 2 แบบหลักคือ text (คนเปิดอ่านรู้เรื่อง) กับ binary (หรือ executable คอมเปิดอ่านรู้เรื่อง) ซึ่งชื่อของมันนั้นไม่จำเป็นต้องลงท้ายด้วย extension เพื่อแยกว่าเป็นชนิดไหนก็ได้ (ระบบจะรู้จาก metadata เอง) ส่วนการที่เราจะรู้ชนิดของมันได้นั้น สามารถใส่ตัวเลือกเพื่อให้แสดงเครื่องหมาย / ตามหลัง directory หรือ * ตามหลัง executable (ส่วน text จะไม่มีอะไรตาม) ดังนี้

การจะเรียกใช้ไฟล์ใดๆ ต้องนำหน้าด้วย ./ หรือ path ที่จะเข้าถึงไฟล์ได้ (ไม่งั้นระบบจะเข้าใจว่าเป็นการเรียกโปรแกรมจาก global แทน) เช่น ต้องการเรียกโปรแกรม a.exe ซึ่งเป็นโปรแกรม hello world

นอกจากนี้ ยังสามารถเรียกใช้งาน shell script จากไฟล์ได้อีกด้วย เช่น ไฟล์ simple เก็บคำสั่ง echo hello shell;

และการอ้างชื่อไฟล์นั้น จะทำโดยใช้ wildcard ก็ได้ โดยสัญลักษณ์ที่ใช้บ่อยคือ * ที่หมายความแทนตัวอักษรใดๆ เป็นจำนวนกี่ตัวก็ได้ เช่น



การ copy ไฟล์ทำได้โดยคำสั่ง cp ตามด้วยไฟล์ต้นฉบับ และที่อยู่ที่จะ copy ไฟล์นั้น

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

ส่วนการลบไฟล์นั้น ทำได้โดยคำสั่ง rm ตามด้วยชื่อไฟล์ที่ต้องการลบ

December 1, 2011

Shell: โครงสร้างไดเรกทอรี

โครงสร้าง directory ในระบบ Unix/Linux จะมีหน้าตาประมาณ

โดยที่ / (แค่ / ตัวเดียว) คือ directory ราก ส่วน /home/username/ จะเป็น directory ประจำผู้ใช้ ซึ่งระบบจะย่อให้เป็น ~ เพื่อให้อ่าน/เรียกใช้ได้สะดวกขึ้น

ภายในแต่ละ directory จะมี directory พิเศษที่ชื่อว่า . (directory ตัวเอง) และ .. (directory แม่) ไว้สำหรับการ browse directory



แม้ว่า Unix/Linux บางระบบจะแสดง path ไว้ที่ prompt อยู่แล้ว แต่เราก็สามารถเรียกดู fullpath ได้โดยคำสั่ง pwd (ซึ่งจะไม่ย่อ home direstory) ครับ


การแสดงไฟล์ที่มีอยู่ใน directory นั้นๆ สามารถทำโดยคำสั่ง ls

สังเกตว่านอกจาก . กับ .. แล้ว ยังมีไฟล์ที่โดนซ่อนไว้โดยใช้ . นำหน้าชื่ออีกด้วย

ส่วนการแสดงไฟล์ที่อยู่ใน directory อื่น อาจผ่าน argument เข้าไปให้ ls ก็ได้



แต่ถ้าต้องการเปลี่ยน directory ก็ทำได้ผ่านคำสั่ง cd

สังเกตว่าถ้าไม่ผ่าน argument เป็นชื่อ directory เข้าไป มันจะพาเรากลับ directory ส่วนตัวครับ

ส่วนการสร้าง/ลบ directory ได้โดยคำสั่ง mkdir และ rmdir

สังเกตว่าการลบด้วย rmdir จะต้องทำกับ directory ว่างๆ เท่านั้น ถ้าต้องการลบ directory ที่ยังมีไฟล์อยู่ในนั้นทำได้โดยคำสั่ง rm -r

สิ่งที่ต้องระวังให้มากคือ เราไม่สามารถกู้คืนไฟล์ที่ลบด้วย rmdir หรือ rm -r ได้นะครับ