Unix02.txt คำสั่งที่ใช้ในการแสดงผลแฟ้มชนิด text file ------------------------------------ คำสั่งที่ใช้ในการแสดงผลแฟ้มชนิด text file มีหลายคำสั่ง มีไว้ให้เลือกใช้ตามความเหมาะสม คำสั่งเหล่านี้ได้แก่ cat, head, tail, more, และ less cat - concatenate files and print on the standard output ------------------------------------------------------- cat [-option] [รายชื่อแฟ้ม] คำสั่ง cat นำข้อมูลจากแฟ้มที่ระบุมาต่อกัน และแสดงออกทาง standard output ในกรณีที่ผู้ใช้ไม่ระบุชื่อแฟ้ม cat จะใช้ชื่อแฟ้มโดยปริยายเป็น standard input ตัวอักขระที่ผู้ใช้ป้อนทางแป้นพิมพ์จะแสดงออกทางจอภาพ การทำงานของ cat จะจบลงเมื่อผู้ใช้กดแป้น Ctrl-D ซึ่งใช้สร้างรหัสปิดแฟ้ม การใช้ cat กับ standard input ส่วนใหญ่ใช้กับการเปลี่ยนทิศทาง output ไปยังแฟ้ม เป็นวิธีการอย่างง่ายที่สุดในการพิมพ์ข้อมูลเก็บลงในแฟ้ม สำหรับผู้เขียนโปรแกรม option ที่น่าสนใจของ cat ได้แก่ -n ซึ่งใช้ในการพิมพ์หมายเลขบรรทัดนำหน้าโปรแกรมแต่ละบรรทัด หมายเหตุ concatenation เป็นการนำสายอักขระสองชุดมาต่อเข้าด้วยกันเป็นชุดเดึยว เช่น นำสายอักขระ "snow" มาต่อกับสายอักขระ "ball" ได้เป็นสายอักขระ "snowball" head - output the first part of files ------------------------------------- head [-option] รายชื่อแฟ้ม คำสั่ง head พิมพ์ข้อมูล 10 บรรทัดแรกจากรายชื่อแฟ้มที่กำหนด ทาง standard output จำนวนบรรทัดเปลี่ยนแปลงได้ โดยระบุจำนวนบรรทัดที่ต้องการเป็น option เช่นต้องการพิมพ์ 15 บรรทัดแรกจากแฟ้ม matrix.c $ head -15 matrix.c tail - output the last part of files ------------------------------------ tail [-option] รายชื่อแฟ้ม คำสั่ง tail <ชื่อแฟ้ม> พิมพ์ข้อมูล 10 บรรทัดสุดท้ายจากแฟ้มที่กำหนด ทาง standard output จำนวนบรรทัดเปลี่ยนแปลงได้ โดยระบุจำนวนบรรทัดที่ต้องการเป็น option เช่นต้องการพิมพ์ 15 บรรทัดสุดท้ายจากแฟ้ม matrix.c $ tail -15 matrix.c หมายเหตุ ------- ในกรณีที่มีหลายแฟ้ม นำแต่ละแฟ้มด้วยคำสั่ง head และ tail จะแสดงชื่อแฟ้มก่อนแสดงข้อมูลในแฟ้ม ==> ชื่อแฟ้ม <== และเว้นบรรทัดคั่นระหว่างแฟ้มต่อแฟ้ม และในกรณีที่มีหลายแฟ้ม คำสั่ง tail ไม่สามารถกำหนดจำนวนบรรทัดในการแสดงผลได้ more - file perusal filter for crt viewing ------------------------------------------ more [-option] รายชื่อแฟ้ม คำสั่ง more ทำหน้าที่อ่านข้อมูลจากแฟ้มที่กำหนดแสดงออกครั้งละ 1 จอภาพ และรอให้ผู้ใช้กดแป้น Enter สำหรับเลื่อนครั้งละบรรทัด วรรค (space) สำหรับเลื่อนครั้งละหน้าจอ และ q สำหรับเลิกการทำงาน โปรแกรมสำหรับแสดงข้อมูลครั้งหน้าจอ มีชื่อเรียกเฉพาะว่า pager สำหรับ option ที่น่าสนใจ ได้แก่ -n เมื่อ n เป็นจำนวนบรรทัดต่อหน้าจอ เช่น -20 แสดงผลครั้งละ 20 บรรทัด -d แสดง [Press space to continue, 'q' to quit.] ที่ด้านล่างสุดของจอ less - opposite of more ----------------------- less [-option] รายชื่อแฟ้ม less เป็นโปรแกรมที่รวมคุณลักษณะการทำงานของ more และการควบคุมการทำงานของ vi เข้าด้วยกัน พัฒนาขึ้นเพื่อใช้แทน more สามารถใช้แป้นลูกศรขึ้นและลง เลื่อนหน้าจอขึ้นและลงได้ เลิกการทำงานแบบเดียวกับ vi คือใช้แป้น q ชื่อของโปรแกรมมาจากคำที่ว่า less is more - (มี) น้อย คือ (มี) มาก หรือการทำอะไรที่ง่ายไม่ซับซ้อน มีขั้นตอนแต่น้อยเท่าที่จำเป็น จะได้งานที่ชัดเจนและมีประสิทธิภาพสูง คำสั่งแสดงสถานะของโพรเซส ps และ top ------------------------------- ps - สถานะของโพรเซสที่กำลังทำงานอยู่กับ shell ที่กำลังใช้งานในปัจจุบัน $ ps PID TTY TIME CMD 13472 pts/0 00:00:00 bash 21057 pts/0 00:00:00 ps option -e แสดงโพรเซสทั้งหมดที่มีในระบบ (entire) -f แสดงรายละเอียดของโพรเซส (full-format listing) คำสั่ง ps -ef แสดงรายละเอียดของโพรเซสทั้งหมดในระบบในแบบ full-format listing เนื่องจากมีจำนวนโพรเซสเป็นจำนวนมาก จึงควร ส่ง output ไปเป็น input ของโปรแกรมในกลุ่ม pager เช่น more $ ps -ef | more UID PID PPID C STIME TTY TIME CMD root 1 0 0 Feb04 ? 00:00:16 /sbin/init root 2 0 0 Feb04 ? 00:00:00 [kthreadd] root 3 2 0 Feb04 ? 00:00:00 [ksoftirqd/0] ... ... ... ... ... ... ... ... ... ... ... ... ... ความหมายของแต่ละฟิลด์อาจแตกต่างกันออกไปบ้างตามระบบ แต่โดยทั่วไปเป็นดังนี้ UID ผู้ใช้ที่เป็นเจ้าของโพรเซส PID หมายเลขโพรเซส (process id) PPID หมายเลขโพรเซสของ parent (parent process id) C ในปัจจุบันไม่ได้ใช้งานแล้ว STIME เวลาเริ่มสร้างโพรเซส TTY controlling terminal ของโพรเซส TIME เวลาที่โพรเซสใช้งาน CPU (เวลาสะสม) CMD คำสั่ง (โปรแกรม) ที่ใช้สร้างโพรเซส คำสั่ง top ใช้ในการแสดงสถานะของโพรเซสแบบต่อเนื่อง และสามารถจัดเรียงโพรเซสได้หลายรูปแบบ โดยทั่วไปเรียงตามเวลาในการใช้งาน CPU เช่น $ top -u jira -d 100.0 top - 21:03:26 up 3 days, 5:05, 2 users, load average: 0.00, 0.01, 0.05 Tasks: 152 total, 2 running, 150 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 16433820 total, 13320344 used, 3113476 free, 175400 buffers KiB Swap: 16774140 total, 0 used, 16774140 free. 1918760 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13468 jira 20 0 105632 2080 1008 S 0.0 0.0 0:00.19 sshd 13472 jira 20 0 21060 3512 1736 S 0.0 0.0 0:00.74 bash 13613 jira 20 0 21124 3580 1732 S 0.0 0.0 0:00.05 bash 14418 jira 20 0 23648 1592 1116 R 0.0 0.0 0:00.65 top 21142 jira 20 0 8172 932 788 S 0.0 0.0 0:00.00 more $ top -u jira -d 100.0 | | | duration: update การแสดงผลทุก ss.t วินาที user: แสดงเฉพาะโพรเซสของผู้ใช้ที่กำหนด คำสั่ง sort --------- sort - จัดเรียงบรรทัดข้อมูลตามตัวอักษร (lexicographical order) และเรียงจากน้อยไปมาก (ascending order) รูปแบบการใช้งาน sort [-option] <แฟ้มข้อมูลที่ต้องการเรียง> option ที่น่าสนใจ -n จัดเรียงตามลำดับของตัวเลข เช่น 2 มาก่อน 10 (ไม่สนใจ blanks และ tabs) -r เปลี่ยนทิศทางการจัดเรียง - เรียงจากมากไปน้อย -f เรียงโดยไม่สนใจว่าจะเป็นอักษรตัวใหญ่หรือตัวเล็ก -M เรียงตามชื่อเดือน ได้แก่ Jan < Feb < ... < Dec -k กำหนด key ในการจัดเรียง (กำหนดได้เพียงฟิลด์เดียว แต่ละฟิลด์คั่นด้วยวรรค) รูปแบบ: key ตำแหน่งเริ่มต้น[,ตำแหน่งสุดท้าย] - ตำแหน่งเริ่มต้น มีรูปแบบเป็น F[.C][OPTS] F - หมายเลขฟิลด์ (ค่าโดยปริยาย = 1) C - ตำแหน่งของอักขระในฟิลด์นั้น (หากไม่กำหนดค่าโดยปริยาย = 1) OPTS - เป็น option ในการจัดเรียง ซึ่งอาจใช้หลายตัวผสมกันได้ - ตำแหน่งสุดท้าย (หากไม่กำหนดค่าโดยปริยาย = จุดสิ้นสุดบรรทัด, end-of-line) ตัวอย่าง ----- แสดงรายละเอียดของแฟ้มจากคำสั่ง ls เรียงตามชื่อเดือน $ ls -l | sort -k6M # เรียงตามชื่อเดือนซึ่งเป็นฟิลด์ที่ 6 คำสั่ง grep -------- grep และ egrep - พิมพ์บรรทัดที่มีสายอักขระตรงกับ pattern ที่กำหนด รูปแบบการใช้งาน grep [options] pattern [<ชื่อแฟ้ม>] คำอธิบาย grep ทำการค้นหา pattern ในแฟ้มที่ไม่กำหนด กรณีที่ผู้ใช้ไม่ระบุชื่อแฟ้ม grep จะอ่านจาก standard input (stdin) โดยทำการอ่านทีละบรรทัด เมื่อพบบรรทัดที่มี pattern จะทำการพิมพ์บรรทัดนั้นออกทางจอภาพ ในการใช้งานจริงควรกำกับ pattern ด้วยเครื่องหมายคำพูดเดี่ยว (single quote, ') เพื่อป้องกัน shell ตีความอักขระใน pattern เป็นอักขระพิเศษของ shell pattern ที่ใช้กำหนดเป็นรูปแบบในการค้น คือนิพจน์ปรกติ (Regular Expression เรียกย่อเป็น regexp หรือ regex) ซึ่งเป็นภาษาระดับ 0 ในลำดับภาษาของ Noam Chomsky คือ Regular Language ซึ่งเป็นเนื้อหาในรายวิชา Theory of Computation นิพจน์ปรกติประกอบด้วย อักขระพิเศษ (meta-character) ซึ่งไม่ได้หมายถึงอักขระนั้นแต่มีความหมายเป็นพิเศษ เช่น . หมายถึงอักขระใดๆ จำนวนหนึ่งตัว และอักขระปกติ (literal) นิพจน์ปรกติมีสองแบบแตกต่างกันตามจำนวน meta-character คือ ก). นิพจน์ปรกติพื้นฐาน, Basic Regular Expression (BREs) และ ข). นิพจน์ปรกติส่วนขยาย, Extended Regular Expression (EREs) (ก). นิพจน์ปรกติพื้นฐาน (BREs) มี meta-character ดังนี้ $ * . [ \ ^ (ข). นิพจน์ปรกติส่วนขยาย (EREs) มีจำนวน meta-character ดังนี้ $ ( ) * + . ? [ \ ^ { | meta-character เหล่านี้เมื่อจะใช้งานเป็น literal ต้องใช้เครื่องหมาย backslash, '\' นำหน้า เรียกว่าการ quote คำสั่ง grep เมื่อใช้งาน meta-character ในกลุ่ม BREs สามารถใช้งานได้โดยตรง หากต้องการใช้งาน meta-chraracter ในกลุ่ม EREs ต้อง quote ?, +, {, |, (, และ ) -- literal \?, \+, \{, \|, \(, และ \) -- meta-character คำสั่ง egrep (หรือ grep -E) สามารถใช้งาน meta-character ได้ทั้ง BREs และ EREs โดยไม่ต้อง quote หมายเหตุ ------ grep เป็นชื่อย่อมาจากคำว่า "Globally search for Regular Expression and Print" หรือการค้นหานิพจน์ปรกติที่มีทั้งหมดเพื่อนำมาพิมพ์ สรุป --- - grep กำหนด pattern ได้เฉพาะ Basic Regular Expression (BREs) - egrep กำหนด pattern ได้ทั้ง BREs และ Extended Regular Expression (EREs) - grep = Globally search for Regular Expression and Print - egrep = grep -E options ที่น่าสนใจ --------------- -i --ignore-case -- ไม่สนใจว่าจะเป็นอักษรตัวเล็กหรือตัวใหญ่ -v --invert-match -- พิมพ์บรรทัดที่ "ไม่มี" pattern ที่กำหนด -n --line-number -- แสดงหมายเลขบรรทัด -w --word-regexp -- จับคู่เฉพาะเมื่อ pattern ตรงกับ "คำ" ใน text string -- ไม่สนใจ substring นิพจน์ปรกติ (Regular expression) ---------------------------- Fundamental building block ----------------------- regexp ที่เป็นองค์ประกอบพื้นฐานที่สุดและสำคัญที่สุดคือ regexp ที่ match กับอักขระหนึ่งตัว อักขระส่วนใหญ่ ซึงรวมตัวอักษรและตัวเลขทั้งหมด แต่ละตัวเป็น regexp ซึ่งจับคู่ได้กับตัวของมันเอง อักขระที่เป็น meta-character เมื่อจะนำมาใช้เป็น literal ต้องกำกับ (quote) โดยใช้เครื่องหมาย backslash นำหน้า period "." -- จับคู่ได้กับอักขระใดๆ จำนวนหนึ่งตัว Character classes and Bracket Expression -------------------------------------- Bracket expression เป็นรายการของตัวอักขระในวงเล็บก้ามปู ใช้จับคู่ได้กับอักขระจำนวนหนึ่งตัวที่ตรงกับสมาชิกในรายการนั้น เครื่องหมาย caret, ^ เป็น complement operator สำหรับจับคู่กับอักขระที่ไม่อยู่ในรายการนั้น และสามารถใช้ range expression ซึ่งเป็นอักขระสองตัวคั่นด้วยยัติภังค์ (hyphen, -) Bracket expression มีชื่อเรียกอีกอย่างหนึ่งว่า character class และมีการกำหนดชื่อสำหรับใช้งาน meta-character ส่วนใหญ่กลายเป็น literal ใน [ ] literal, ] -- กำหนดเป็นตัวแรกในรายการ literal, ^ -- ต้องไม่ใช่ตำแหน่งแรก literal, - -- ต้องเป็นตัวสุดท้ายในรายการ POSIX Character Class Definitions ---------------------------------------- [:digit:] [0-9] [:alnum:] [A-Za-z0-9] [:alpha:] [A-Za-z] [:blank:] [] [:xdigit:] [0-9A-Fa-f] - Hexadecimal notation [:punct:] . , " ' ? ! ; : # $ % & ( ) * + - / < > = @ [ ] \ ^ _ { } | ~ [:print:] Any printable character [:space:] Any white space - [] [:graph:] Any printable characters, exclude [:upper:] [A-Z] [:lower:] [a-z] [:control:] control characters NL CR LF TAB VT FF NUL SOH STX EXT EOT ENQ ACK SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC IS1 IS2 IS3 IS4 DEL ชื่อของ character class เหล่านี้กำหนดให้ใช้ใน square brackets เช่น [[:alnum:]] หรือ [[:digit:]a-d] These are always used inside square brackets in the form [[:alnum:]] or combined as [[:digit:]a-d] Anchoring ------------ caret, ^ และ dollar sign, $ เป็น meta-character ที่จับคู่ได้กับ empty string ที่ต้นและท้ายบรรทัด The Backslash Character and Special Expressions ----------------------------------------------- \< และ \> จับคู่ (ใช้แทน) empty string ที่ต้นและท้ายคำ \b ใช้แทน empty string ที่ "ขอบ" (edge) ของคำ \B ใช้แทน empty string ที่ไม่ใช่ขอบของคำ \w เป็น synonym ของ [_[:alnum:]] \W เป็น synonym ของ [^_[:alnum:]] \s = [:space:] ที่ไม่รวม VT - Vertical Tab Repetition --------- regexp อาจตามด้วย repetition operator ต่อไปนี้ ? zero or one * zero or more + one or more {n} exactly n times {n,} n or more {n,m} between n and m times {,m} at most m times -- GNU extension (non-standard) Concatenation ------------- สามาถนำ regexp สองชุดมาต่อกันได้ (concatenate) และตรงกับสายอักขระที่จับคู่ได้กับ regexp ทั้งสองชุดนั้น Alternation ----------- สามารถกำหนดทางเลือกใน regexp ได้โดยใช้เครื่องหมาย vertical bar, '|' Precedence ---------- ลำดับความสำคัญของเครื่องหมายกำหนดไว้ดังนี้ repetition > concatenation > alternation สามารถใช้วงเล็บ (parentheses, '()' เพื่อเปลี่ยนลำดับความสำคัญ parentheses override these precedence ตัวอย่างการใช้งาน -------------- $ grep BOB tmpfile ค้นข้อมูลในแฟ้ม tmpfile เพื่อหาบรรทัดที่มีคำว่า 'BOB' $ grep -i -w blkptr * ค้นข้อมูลในแฟ้มทุกแฟ้มในไดเรกทอรีปัจจุบัน เพื่อหาบรรทัดที่มีคำว่า blkptr -i ไม่สนใจว่าคำนั้นจะเป็นอักษรตัวเล็ก (lowercase) หรืออักษรตัวใหญ่ (uppercase) -- ignore case -w กำหนดให้ match เฉพาะคำ (ไม่ใช่ส่วนใดส่วนหนึ่งของคำ) $ grep run[- ]time *.txt ค้นคำว่า "run time" หรือ "run-time" ในแฟ้มทุกแฟ้มที่มีส่วนขยายเป็น .txt [- ] -- เป็น character class ที่มีสมาชิก 2 ตัวคือ - และวรรค (space) $ who | grep root ส่ง output ของคำสั่ง who เป็น input ของ grep เพื่อหาบรรทัดที่มีคำว่่า root $ grep smug files ค้นข้อมูลในแฟ้ม files เพื่อหาบรรทัดที่มีคำว่า 'smug' $ grep '^smug' files ค้นเฉพาะบรรทัดที่ขึ้นต้นด้วย 'smug' $ grep 'smug$' files ค้นเฉพาะบรรทัดที่ลงท้ายด้วย 'smug' $ grep '^smug$' files ตรงกับ (ค้นเฉพาะ) บรรทัดที่มีคำว่า 'smug' เพียงคำเดียว $ grep '\^s' files ค้นบรรทัดที่ขึ้นต้นด้วย '^s' -- "\" escapes the ^ $ grep '[Ss]mug' files ค้นคำว่า 'Smug' หรือ 'smug' $ grep 'B[oO][bB]' files ตรงกับคำว่า BOB, BOb, BoB, Bob $ grep '^S' files หาบรรทัดว่าง (blank lines) $ grep '[0-9][0-9]' files หาเลขสองหลัก