Linux command: Redirect — redirect output to file

Olarik Surinta
olarik
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.html
3 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.html
3 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.html
3 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

--

--