# Awk Script

<figure><img src="/files/sU1ym2JJ181P8IQRoS4a" 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aic-eec.com/computer-operation-systems/zero-to-linux-hero/anatomy-of-linux-system/basic-bash-script/awk-script.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
