Linux command: Redirect — redirect output to file
Published in
5 min readFeb 12, 2019
ในลินุกซ์ redirect
ใช้สำหรับการจัดการข้อมูล (Data manipulation) เช่น การส่งผลลัพธ์ (output) หรือข้อผิดพลาด (error) จากโปรแกรมไปจัดเก็บยังไฟล์ หรืออ่านข้อมูลจากไฟล์
ประเภทข้อมูลที่ใช้ในการ redirect
สำหรับทุก ๆ การทำงานของโปรแกรมจะใช้ data
ทั้งสิ้น 3 รูปแบบ ประกอบด้วย
STDIN
- standard input หมายถึงข้อมูลที่ถูกส่งเข้าไปยังโปรแกรมSTDOUT
- standard output หมายถึงผลลัพธ์ที่ได้จากโปรแกรมที่แสดงผลทางเทอร์มินัล (Terminal)STDERR
- standard error หมายถึงการแสดงผลข้อผิดพลาด (error message)
เครื่องหมายที่ใช้ในการ redirect
>
หมายถึง การบันทึกผลลัพธ์ลงไปในไฟล์ หากเป็นไฟล์เดิมที่มีข้อมูลอยู่ ระบบจะลบข้อมูลเดิมทิ้งทั้งหมด>>
หมายถึง การบันทึกผลลัพธ์ลงไปต่อท้ายไฟล์ หากเป็นไฟล์เดิมที่มีข้อมูลอยู่ ระบบจะบันทึกต่อท้ายข้อมูลเดิม<
หมายถึง การอ่านข้อมูลจากไฟล์และนำมาประมวลผล2>
หมายถึง การบันทึกเฉพาะข้อผิดพลาด (error message) ลงไปในไฟล์
การใช้เครื่องหมาย >
ในการ redirect
- เริ่มต้นด้วยการแสดงไดเรกทอรีและไฟล์ด้วยคำสั่ง
tree
$ tree
.
├── html
│ └── index.html
├── iris.data
├── sample.data
├── test
└── tmp1
├── index.htm
└── index.html3 directories, 5 files
- จากนั้นแสดงข้อมูลจากไฟล์
iris.data
ด้วยคำสั่งtail
แสดงดังต่อไปนี้
$ tail -10 iris.data
6.7 3.1 5.6 2.4 Iris-virginica
6.9 3.1 5.1 2.3 Iris-virginica
5.8 2.7 5.1 1.9 Iris-virginica
6.8 3.2 5.9 2.3 Iris-virginica
6.7 3.3 5.7 2.5 Iris-virginica
6.7 3.0 5.2 2.3 Iris-virginica
6.3 2.5 5.0 1.9 Iris-virginica
6.5 3.0 5.2 2.0 Iris-virginica
6.2 3.4 5.4 2.3 Iris-virginica
5.9 3.0 5.1 1.8 Iris-virginica
- เริ่มต้นทดสอบการทำงานของเครื่องหมาย
>
ด้วยคำสั่งดังต่อไปนี้
$ tail -10 iris.data > iris_sample.data
- จากตัวอย่างข้างต้น ข้อมูลทั้งหมดที่แสดงทางจอภาพจำนวน 10 แถวจะถูกบันทึกเก็บลงไปในไฟล์
iris_sample.data
จากนั้นสามารถตรวจสอบข้อมูลที่อยู่ในไฟล์ด้วยคำสั่งดังต่อไปนี้
$ cat iris_sample.data
6.7 3.1 5.6 2.4 Iris-virginica
6.9 3.1 5.1 2.3 Iris-virginica
5.8 2.7 5.1 1.9 Iris-virginica
6.8 3.2 5.9 2.3 Iris-virginica
6.7 3.3 5.7 2.5 Iris-virginica
6.7 3.0 5.2 2.3 Iris-virginica
6.3 2.5 5.0 1.9 Iris-virginica
6.5 3.0 5.2 2.0 Iris-virginica
6.2 3.4 5.4 2.3 Iris-virginica
5.9 3.0 5.1 1.8 Iris-virginica
- เนื่องจากเครื่องหมาย
>
ในลินุกซ์หมายถึงการบันทึกข้อมูลลงไปยังไฟล์ โดยระบบจะลบข้อมูลจากไฟล์เดิมทิ้งทั้งหดม ดังนั้น สามารถทดสอบเครื่องหมาย>
โดยใช้คำสั่งดังต่อไปนี้
$ head -15 iris.data > iris_sample.data
- จากตัวอย่างข้างต้น การใช้คำสั่ง
head -15 iris.data
หมายถึงการแสดงข้อมูลของไฟล์iris.data
โดยแสดงเฉพาะ 15 แถวแรกเท่านั้น สามารถดูผลลัพธ์ ด้วยการพิมพ์คำสั่งดังต่อไปนี้
$ cat iris_sample.data
5.1 3.5 1.4 0.2 Iris-setosa
4.9 3.0 1.4 0.2 Iris-setosa
4.7 3.2 1.3 0.2 Iris-setosa
4.6 3.1 1.5 0.2 Iris-setosa
5.0 3.6 1.4 0.2 Iris-setosa
5.4 3.9 1.7 0.4 Iris-setosa
4.6 3.4 1.4 0.3 Iris-setosa
5.0 3.4 1.5 0.2 Iris-setosa
4.4 2.9 1.4 0.2 Iris-setosa
4.9 3.1 1.5 0.1 Iris-setosa
5.4 3.7 1.5 0.2 Iris-setosa
4.8 3.4 1.6 0.2 Iris-setosa
4.8 3.0 1.4 0.1 Iris-setosa
4.3 3.0 1.1 0.1 Iris-setosa
5.8 4.0 1.2 0.2 Iris-setosa
- จากผลลัพธ์ข้างต้น ข้อมูลเดิมที่อยู่ในไฟล์
iris.data
จำนวนทั้งสิ้น 10 แถวจะถูกลบ แล้วแทนที่ด้วยข้อมูลใหม่จำนวน 15 แถว - ดังนั้น หากต้องการใช้เครื่องหมาย
>
จะต้องตรวจสอบให้แน่ชัดว่าในไฟล์ที่จะบันทึกลงไปนั้นเป็นไฟล์ว่างที่ไม่มีข้อมูล มิเช่นนั้น ข้อมูลเดิมที่อยู่จะไฟล์จะหายไปทั้งหมด
การใช้เครื่องหมาย >>
ในการ redirect
- เครื่องหมาย
>>
หมายถึงการบันทึกข้อมูลลงไปต่อท้ายข้อมูลเดิม - เริ่มต้นด้วยการแสดงข้อมูลที่อยู่ในไฟล์
iris_sample.data
ด้วยคำสั่งcat
ดังต่อไปนี้
$ cat iris_sample.data
5.1 3.5 1.4 0.2 Iris-setosa
4.9 3.0 1.4 0.2 Iris-setosa
4.7 3.2 1.3 0.2 Iris-setosa
4.6 3.1 1.5 0.2 Iris-setosa
5.0 3.6 1.4 0.2 Iris-setosa
5.4 3.9 1.7 0.4 Iris-setosa
4.6 3.4 1.4 0.3 Iris-setosa
5.0 3.4 1.5 0.2 Iris-setosa
4.4 2.9 1.4 0.2 Iris-setosa
4.9 3.1 1.5 0.1 Iris-setosa
5.4 3.7 1.5 0.2 Iris-setosa
4.8 3.4 1.6 0.2 Iris-setosa
4.8 3.0 1.4 0.1 Iris-setosa
4.3 3.0 1.1 0.1 Iris-setosa
5.8 4.0 1.2 0.2 Iris-setosa
- ขั้นตอนต่อไป ทำการทดสอบการใช้เครื่องหมาย
>>
ด้วยคำสั่งดังต่อไปนี้
$ cat iris_sample.data
5.1 3.5 1.4 0.2 Iris-setosa
4.9 3.0 1.4 0.2 Iris-setosa
4.7 3.2 1.3 0.2 Iris-setosa
4.6 3.1 1.5 0.2 Iris-setosa
5.0 3.6 1.4 0.2 Iris-setosa
5.4 3.9 1.7 0.4 Iris-setosa
4.6 3.4 1.4 0.3 Iris-setosa
5.0 3.4 1.5 0.2 Iris-setosa
4.4 2.9 1.4 0.2 Iris-setosa
4.9 3.1 1.5 0.1 Iris-setosa
5.4 3.7 1.5 0.2 Iris-setosa
4.8 3.4 1.6 0.2 Iris-setosa
4.8 3.0 1.4 0.1 Iris-setosa
4.3 3.0 1.1 0.1 Iris-setosa
5.8 4.0 1.2 0.2 Iris-setosa
total 36
drwxrwxr-x 5 kaveepoj kaveepoj 4096 ก.ย. 10 16:38 .
drwxr-xr-x 4 kaveepoj kaveepoj 4096 ก.ย. 5 10:08 ..
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 09:26 html
-rw-rw-r-- 1 kaveepoj kaveepoj 4550 ก.ย. 10 14:37 iris.data
-rw-rw-r-- 1 kaveepoj kaveepoj 420 ก.ย. 10 16:38 iris_sample.data
-rw-rw-r-- 1 kaveepoj kaveepoj 160 ก.ย. 10 15:15 sample.data
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 16:20 test
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 09:28 tmp1
- สังเกตได้ว่าข้อมูลที่ได้จากคำสั่ง
ls -la
ถูกนำมาบันทึกไว้ในไฟล์iris_sample.data
โดยนำไปต่อท้ายข้อมูลเดิม ทำให้ข้อมูลเดิมไม่ถูกลบ
การใช้เครื่องหมาย <
ในการ redirect
- เครื่องหมาย
<
หมายถึงการอ่านข้อมูลจากไฟล์ และนำมาประมวลผลด้วยคำสั่งอื่น ตัวอย่างการใช้เครื่องหมาย<
แสดงดังต่อไปนี้
$ grep 'drw'< iris_sample.data
drwxrwxr-x 5 kaveepoj kaveepoj 4096 ก.ย. 10 16:38 .
drwxr-xr-x 4 kaveepoj kaveepoj 4096 ก.ย. 5 10:08 ..
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 09:26 html
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 16:20 test
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 09:28 tmp1
- จากตัวอย่างข้างต้น คือการอ่านข้อมูลจากไฟล์
iris_sample.data
และนำมาประมวลผลต่อด้วยคำสั่งgrep 'drw'
เพื่อค้นหาข้อมูล'drw'
ซึ่งผลลัพธ์ที่ได้จะเหมือนกับคำสั่งดังต่อไปนี้grep 'drw' iris_sample.data
$ grep 'drw' iris_sample.data
drwxrwxr-x 5 kaveepoj kaveepoj 4096 ก.ย. 10 16:38 .
drwxr-xr-x 4 kaveepoj kaveepoj 4096 ก.ย. 5 10:08 ..
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 09:26 html
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 16:20 test
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 09:28 tmp1
การใช้เครื่องหมาย 2>
ในการ redirect
- เครื่องหมาย
2>
หมายถึงการจัดเก็บเฉพาะข้อผิดพลาด (error message) ลงไปไว้ในไฟล์เท่านั้น ดังนั้น หากคำสั่งที่พิมพ์ลงไปในเทอร์มินัล (terminal) ไม่มีข้อผิดพลาด ดังนั้น ก็จะไม่มีไฟล์ใด ๆ เกิดขึ้น - เริ่มต้นทดสอบด้วยการพิมพ์คำสั่ง
tree
เพื่อดูโครงสร้างของไฟล์และไดเรกทอรี
$ tree
.
├── html
│ └── index.html
├── iris.data
├── iris_sample.data
├── sample.data
├── test
└── tmp1
├── index.htm
└── index.html3 directories, 6 files
- จากนั้นทดสอบด้วยคำสั่ง
ls -la htm
ซึ่งไดเรกทอรีhtm
ไม่มีอยู่ในโครงสร้าง ดังนั้นจึงจะเกิดข้อผิดพลาด (error message) ดังต่อไปนี้
$ ls -la htm
ls: cannot access 'htm': No such file or directory
- จากข้อผิดพลาดข้างต้น แสดงให้เห็นว่าไม่มีไดเรกทอรี
html
จึงทำให้ไม่สามารถเข้าถึงข้อมูลได้ - ดังนั้นหากต้องการที่จะเก็บข้อผิดพลาดไว้ตรวจสอบภายหลังสามารถทำได้โดยใช้คำสั่งดังต่อไปนี้
$ ls -la htm 2> error.log
- จากคำสั่งข้างต้น จะเกิดข้อผิดพลาด และข้อผิดพลาดนั้นจะถูกบันทึกเก็บไว้ในไฟล์
error.log
สามารถพิมพ์คำสั่งtree
เพื่อดูไฟล์ แสดงดังต่อไปนี้
$ tree
.
├── error.log
├── html
│ └── index.html
├── iris.data
├── iris_sample.data
├── sample.data
├── test
└── tmp1
├── index.htm
└── index.html3 directories, 7 files
- สามารถดูข้อผิดพลาดที่เกิดขึ้นจากคำสั่ง
ls -la htm
ดังนี้
$ cat error.log
ls: cannot access 'htm': No such file or directory
- ในกรณีที่ไม่พบข้อผิดพลาด สามารถทดสอบได้ดังนี้
$ ls -la html 2> error1.log
total 8
drwxrwxr-x 2 kaveepoj kaveepoj 4096 ก.ย. 6 09:26 .
drwxrwxr-x 5 kaveepoj kaveepoj 4096 ก.ย. 10 16:51 ..
-rw-rw-r-- 1 kaveepoj kaveepoj 0 ก.ย. 5 11:00 index.html
- จากตัวอย่างข้างต้น เมื่อใช้คำสั่ง
ls -la html
จะไม่พบข้อผิดพลาดใด ๆ เนื่องจากไดเรกทอรีhml
ปรากฎอยู่ในไดเรกทอรีปัจจุบัน ดังนั้น ไฟล์error1.log
จึงไม่มีข้อความใด ๆ ปรากฎอยู่ สามารถตรวจสอบข้อมูลที่อยู่ในไฟล์ได้ดังนี้
$ cat error1.log