ค้นหาเว็บไซต์

เรียนรู้วิธีใช้ตัวแปร Awk นิพจน์ตัวเลข และตัวดำเนินการกำหนด - ตอนที่ 8


ฉันเชื่อว่าชุดคำสั่ง Awk กำลังน่าตื่นเต้นมากขึ้นเรื่อยๆ ในเจ็ดส่วนก่อนหน้านี้ เราได้อธิบายพื้นฐานบางประการของ Awk ที่คุณต้องเชี่ยวชาญเพื่อให้สามารถดำเนินการกรองข้อความหรือสตริงพื้นฐานใน Linux ได้

เริ่มจากส่วนนี้ เราจะเจาะลึกในส่วนขั้นสูงของ Awk เพื่อจัดการกับการดำเนินการกรองข้อความหรือสตริงที่ซับซ้อนยิ่งขึ้น ดังนั้น เราจะพูดถึงคุณลักษณะ Awk เช่น ตัวแปร นิพจน์ตัวเลข และตัวดำเนินการกำหนด

แนวคิดเหล่านี้ไม่ได้แตกต่างอย่างครอบคลุมจากแนวคิดที่คุณอาจเคยพบในภาษาการเขียนโปรแกรมหลายภาษาก่อนเช่นเชลล์, C, Python และอีกมากมาย ดังนั้นจึงไม่จำเป็นต้องกังวลมากเกี่ยวกับหัวข้อนี้ เราเพียงแค่แก้ไขแนวคิดทั่วไปของการใช้ คุณสมบัติที่กล่าวมาเหล่านี้

นี่อาจเป็นหนึ่งในส่วนคำสั่ง Awk ที่ง่ายที่สุดในการทำความเข้าใจ ดังนั้นนั่งลงและไปดำเนินการต่อได้เลย

1. ตัวแปร Awk

ในภาษาการเขียนโปรแกรมใดๆ ตัวแปรคือตัวยึดตำแหน่งที่เก็บค่า เมื่อคุณสร้างตัวแปรในไฟล์โปรแกรม ขณะที่ไฟล์ถูกดำเนินการ พื้นที่บางส่วนจะถูกสร้างขึ้นในหน่วยความจำซึ่งจะจัดเก็บค่าที่คุณระบุสำหรับตัวแปร

คุณสามารถกำหนดตัวแปร Awk ได้ในลักษณะเดียวกับที่คุณกำหนดตัวแปรเชลล์ดังนี้:

variable_name=value 

ในไวยากรณ์ด้านบน:

  1. variable_name: คือชื่อที่คุณตั้งให้กับตัวแปร
  2. value: ค่าที่เก็บไว้ในตัวแปร

ลองดูตัวอย่างด้านล่าง:

computer_name=”linux-console.net”
port_no=”22”
email=”[email ”
server=”computer_name”

ดูตัวอย่างง่ายๆ ข้างต้น ในคำจำกัดความตัวแปรแรก ค่า linux-console.net ถูกกำหนดให้กับตัวแปร computer_name

นอกจากนี้ ค่า 22 ถูกกำหนดให้กับตัวแปร port_no แล้ว ยังสามารถกำหนดค่าของตัวแปรหนึ่งให้กับตัวแปรอื่นได้เหมือนในตัวอย่างสุดท้ายที่เรากำหนดค่า ของ computer_name ไปยังเซิร์ฟเวอร์ตัวแปร

หากคุณจำได้ จากส่วนที่ 2 ของซีรีส์ Awk นี้ เราได้พูดถึงการแก้ไขฟิลด์ เราได้พูดคุยเกี่ยวกับวิธีที่ Awk แบ่งบรรทัดอินพุตออกเป็นฟิลด์ และใช้ตัวดำเนินการเข้าถึงฟิลด์มาตรฐาน $ เพื่ออ่านฟิลด์ต่างๆ ที่ ได้รับการแยกวิเคราะห์แล้ว นอกจากนี้เรายังสามารถใช้ตัวแปรเพื่อเก็บค่าของเขตข้อมูลได้ดังต่อไปนี้

first_name=$2
second_name=$3

ในตัวอย่างข้างต้น ค่าของ first_name ถูกตั้งค่าเป็นฟิลด์ที่สอง และ second_name ถูกตั้งค่าเป็นฟิลด์ที่สาม

เพื่อเป็นตัวอย่าง ให้พิจารณาไฟล์ชื่อ names.txt ซึ่งมีรายชื่อผู้ใช้แอปพลิเคชันที่ระบุชื่อและนามสกุลพร้อมเพศ เมื่อใช้คำสั่ง cat เราจะสามารถดูเนื้อหาของไฟล์ได้ดังนี้:

cat names.txt

จากนั้น เรายังสามารถใช้ตัวแปร first_name และ second_name เพื่อจัดเก็บชื่อและชื่อที่สองของผู้ใช้คนแรกในรายการโดยเรียกใช้ Awk คำสั่งด้านล่าง:

awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt

เรามาดูอีกกรณีหนึ่งกัน เมื่อคุณออกคำสั่ง uname -a บนเทอร์มินัลของคุณ มันจะพิมพ์ข้อมูลระบบทั้งหมดของคุณออกมา

ฟิลด์ที่สองประกอบด้วย ชื่อโฮสต์ ของคุณ ดังนั้นเราสามารถจัดเก็บ ชื่อโฮสต์ ในตัวแปรที่เรียกว่า ชื่อโฮสต์ และพิมพ์โดยใช้ Awk ดังนี้:

uname -a
uname -a | awk '{hostname=$2 ; print hostname ; }' 

2. นิพจน์ตัวเลข

ใน Awk นิพจน์ตัวเลขจะถูกสร้างขึ้นโดยใช้ตัวดำเนินการตัวเลขต่อไปนี้:

  1. * : ตัวดำเนินการคูณ
  2. + : ตัวดำเนินการเพิ่มเติม
  3. / : ตัวดำเนินการหาร
  4. - : ตัวดำเนินการลบ
  5. % : ตัวดำเนินการโมดูลัส
  6. ^ : ตัวดำเนินการยกกำลัง

ไวยากรณ์สำหรับนิพจน์ตัวเลขคือ:

operand1 operator operand2

ในรูปแบบด้านบน operand1 และ operand2 อาจเป็นตัวเลขหรือชื่อตัวแปรได้ และ operator คือตัวดำเนินการใดๆ ข้างต้น

ด้านล่างนี้คือตัวอย่างบางส่วนที่สาธิตวิธีสร้างนิพจน์ตัวเลข:

counter=0
num1=5
num2=10
num3=num2-num1
counter=counter+1

เพื่อให้เข้าใจถึงการใช้นิพจน์ตัวเลขใน Awk เราจะพิจารณาตัวอย่างต่อไปนี้ด้านล่าง พร้อมด้วยไฟล์ domains.txt ซึ่งมีโดเมนทั้งหมดที่เป็นของ Tecmint.

news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net

หากต้องการดูเนื้อหาของไฟล์ให้ใช้คำสั่งด้านล่าง:

cat domains.txt

หากเราต้องการนับจำนวนครั้งที่โดเมน linux-console.net ปรากฏในไฟล์ เราสามารถเขียนสคริปต์ง่ายๆ เพื่อดำเนินการดังต่อไปนี้:

#!/bin/bash
for file in $@; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print a number incrementally for every line containing linux-console.net 
                awk  '/^linux-console.net/ { counter=counter+1 ; printf "%s\n", counter ; }'   $file
        else
                #print error info incase input is not a file
                echo "$file is not a file, please specify a file." >&2 && exit 1
        fi
done
#terminate script with exit code 0 in case of successful execution 
exit 0

หลังจากสร้างสคริปต์แล้ว ให้บันทึกและทำให้สามารถเรียกใช้งานได้ เมื่อเรารันสคริปต์ด้วยไฟล์ domains.txt เป็นอินพุตเอาต์พุต เราจะได้ผลลัพธ์ต่อไปนี้:

./script.sh  ~/domains.txt

จากเอาต์พุตของสคริปต์ มี 6 บรรทัดในไฟล์ domains.txt ซึ่งมี linux-console.net เพื่อยืนยันว่าคุณสามารถนับได้ด้วยตนเอง

3. ผู้ดำเนินการที่ได้รับมอบหมาย

คุณลักษณะ Awk สุดท้ายที่เราจะพูดถึงคือตัวดำเนินการมอบหมายงาน มีตัวดำเนินการมอบหมายหลายรายการใน Awk และซึ่งรวมถึงสิ่งต่อไปนี้:

  1. *= : ตัวดำเนินการกำหนดสูตรคูณ
  2. += : ตัวดำเนินการกำหนดเพิ่มเติม
  3. /= : ผู้ดำเนินการกำหนดแผนก
  4. -= : ตัวดำเนินการกำหนดการลบ
  5. %= : ตัวดำเนินการกำหนดโมดูลัส
  6. ^= : ตัวดำเนินการกำหนดเลขยกกำลัง

ไวยากรณ์ที่ง่ายที่สุดของการดำเนินการมอบหมายงานใน Awk มีดังนี้:

variable_name=variable_name operator operand

ตัวอย่าง:

counter=0
counter=counter+1

num=20
num=num-1

คุณสามารถใช้ตัวดำเนินการมอบหมายด้านบนเพื่อลดระยะเวลาการดำเนินการมอบหมายใน Awk ลองพิจารณาตัวอย่างก่อนหน้านี้ เราสามารถดำเนินการมอบหมายในรูปแบบต่อไปนี้:

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

ดังนั้นเราจึงสามารถแก้ไขคำสั่ง Awk ในเชลล์สคริปต์ที่เราเพิ่งเขียนด้านบนโดยใช้ตัวดำเนินการกำหนด += ดังนี้:

#!/bin/bash
for file in $@; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print a number incrementally for every line containing linux-console.net 
                awk  '/^linux-console.net/ { counter+=1 ; printf  "%s\n",  counter ; }'   $file
        else
                #print error info incase input is not a file
                echo "$file is not a file, please specify a file." >&2 && exit 1
        fi
done
#terminate script with exit code 0 in case of successful execution 
exit 0

ในส่วนนี้ของซีรีส์ Awk เราได้กล่าวถึงคุณลักษณะ Awk ที่มีประสิทธิภาพบางส่วน ซึ่งได้แก่ ตัวแปร การสร้างนิพจน์ตัวเลข และการใช้ตัวดำเนินการมอบหมาย ตลอดจนภาพประกอบบางส่วนที่แสดงให้เห็นว่าเราใช้งานคุณลักษณะเหล่านั้นได้อย่างไร

แนวคิดเหล่านี้ไม่แตกต่างจากแนวคิดในภาษาการเขียนโปรแกรมอื่นๆ แต่อาจมีความแตกต่างที่สำคัญบางประการภายใต้การเขียนโปรแกรม Awk

ใน ส่วนที่ 9 เราจะดูคุณลักษณะ Awk เพิ่มเติมที่เป็นรูปแบบพิเศษ: BEGIN และ END ในระหว่างนี้ ให้เชื่อมต่อกับ Tecmint