# Awk Script

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FfJXKZlH8871Csx5AEAUI%2Fawk.png?alt=media&#x26;token=38f4904f-5261-4ef6-b777-11c2f8c3cec2" alt=""><figcaption></figcaption></figure>

Awk ย่อมาจากตัวอักษรแรกของนักพัฒนาทั้งสามคนได้แก่ **A**ho, **W**einberger, และ **K**ernighan ถือว่าเป็นภาษาโปรแกรมชนิดหนึ่งซึ่งมีไว้สำหรับการเข้าถึงข้อมูลที่มีลักษณะเป็นโครงสร้าง (structured data) และสามารถสร้างออกมาให้อยู่ในรูปแบบรายงานได้ คุณสมบัติสำคัญของ awk ประกอบไปด้วย

* awk จะมองไฟล์ข้อมูลในลักษณะคล้ายฐานข้อมูลที่มี เรคอร์ด (record) และ ฟิลด์ (field)
* awk จะมีตัวแปร (variables) ชุดคำสั่งตรวจสอบเงื่อนไข (conditional statement) และชุดคำสั่งทำซ้ำ (loop statement) เหมือนภาษาโปรแกรมทั่วไป
* awk เตรียมตัวดำเนินการทางด้านเลขคณิต (arithmetic) และข้อความ (string)
* awk สามารถสร้างออกมาให้อยู่ในรูปแบบรายงานได้

## รูปแบบคำสั่งการใช้งาน awk

```sh
awk '/search pattern1/ {Actions}
     /search pattern2/ {Actions}' file
```

โดยที่ *search pattern* ก็คือชุด regular expression ส่วน *Actions* ก็คือชุดคำสั่งเชิงโปรแกรม ดังตัวอย่างการใช้คำสั่งข้างล่าง

```shell-session
$ cat data.log 
1  Station01 Temp_Sensor 35.4
2  Station02 Flow_Sensor 12.4
3  Station03 Light_Sensor 55
4  Station04 Motion_Sensor ON
5  Station05 Current_Sensor 1.42

$ awk '/Station01/
> /Station02/' data.log 

1  Station01 Temp_Sensor 35.4
2  Station02 Flow_Sensor 12.4
```

awk สามารถแยกเรคคอร์ดในแต่ละบรรทัดที่คั่นด้วยอักขระช่องว่างออกมาเป็นฟิลด์ย่อยๆและถูกเก็บไว้ในตัวแปร $*n* โดยที่ *n* คือจำนวนเลขฟิลด์ โดยเริ่มต้นที่ $0 จะแทนด้วยข้อความทั้งหมดของบรรทัดนั้นๆ ส่วน $1 จนถึง $*n* นั้นจะเก็บข้อความที่ถูกแยกด้วยช่องว่างแต่ละคอลัมน์ ดังตัวอย่างข้างล่าง

```shell-session
$ awk '{print $2,$4;}' data.log 
Station01 35.4
Station02 12.4
Station03 55
Station04 ON
Station05 1.42
```

สามารถใช้ $NF เพื่อระบุค่าฟิลด์ตัวสุดท้ายได้ ดังตัวอย่างข้างล่าง

```shell-session
$ awk '{print $2,$NF;}' data.log 
Station01 35.4
Station02 12.4
Station03 55
Station04 ON
Station05 1.42
```

คำสั่ง awk จะมีรูปแบบสำคัญอีกส่วนหนึ่งที่ใช้ในการกระทำคำสั่งตอนเริ่มต้น (Initialization) ก่อนที่่จะเริ่มดำเนินการวิเคราะห์แต่ละบรรทัดภายในไฟล์ และจะกระทำคำสั่งตอนสิ้นสุด (Final) หลังจากบรรทัดสุดท้ายดำเนินการเสร็จเรียบร้อยแล้ว โดยการใช้ BEGIN และ END ดังรูปแบบการเรียกใช้คำสั่งดังนี้

```bash
BEGIN { Actions }
{Action} # Action for every lines in a file
END { Actions }
# is for comments in Awk
```

ตัวอย่างการใช้คำสั่ง awk แบบเต็มรูป

```shell-session
$ awk 'BEGIN {print "Station Name\tSensor Type\t\t\tValue";}
> {print $2,"\t",$3,"\t\t\t",$NF;}
> END{print "Report Generated\n--------------";
> }' data.log
Station Name Sensor Type Value
Station01  Temp_Sensor 35.4
Station02 Flow_Sensor 12.4
Station03  Light_Sensor 55
Station04 Motion_Sensor ON
Station05  Voltage_Sensor 1.42
Report Generated
--------------
```

เพื่อความสะดวกยิ่งขึ้น นักพัฒนาสามารถเก็บคำสั่งลงในไฟล์สคริปท์ได้ เช่น เก็บลงในไฟล์ datalog.script ตัวอย่างการใช้คำสั่งเช่น

```shell-session
$ cat datalog.script 
BEGIN {
print "Station Name\tSensor Type\t\t\tValue";
}
{
print $2,"\t",$3,"\t\t\t",$NF;
}
END {
print "Report Generated\n--------------";
}


$ awk -f datalog.script data.log 
Station Name Sensor Type       Value
Station01  Temp_Sensor  35.4
Station02  Flow_Sensor  12.4
Station03  Light_Sensor  55
Station04  Motion_Sensor  ON
Station05  Voltage_Sensor  1.42
Report Generated
--------------
```

{% hint style="info" %}
**Practise More!**

<https://quickref.me/awk.html>
{% endhint %}
