เรียนรู้วิธีใช้ตัวแปร Awk นิพจน์ตัวเลข และตัวดำเนินการกำหนด - ตอนที่ 8
ฉันเชื่อว่าชุดคำสั่ง Awk กำลังน่าตื่นเต้นมากขึ้นเรื่อยๆ ในเจ็ดส่วนก่อนหน้านี้ เราได้อธิบายพื้นฐานบางประการของ Awk ที่คุณต้องเชี่ยวชาญเพื่อให้สามารถดำเนินการกรองข้อความหรือสตริงพื้นฐานใน Linux ได้
เริ่มจากส่วนนี้ เราจะเจาะลึกในส่วนขั้นสูงของ Awk เพื่อจัดการกับการดำเนินการกรองข้อความหรือสตริงที่ซับซ้อนยิ่งขึ้น ดังนั้น เราจะพูดถึงคุณลักษณะ Awk เช่น ตัวแปร นิพจน์ตัวเลข และตัวดำเนินการกำหนด
แนวคิดเหล่านี้ไม่ได้แตกต่างอย่างครอบคลุมจากแนวคิดที่คุณอาจเคยพบในภาษาการเขียนโปรแกรมหลายภาษาก่อนเช่นเชลล์, C, Python และอีกมากมาย ดังนั้นจึงไม่จำเป็นต้องกังวลมากเกี่ยวกับหัวข้อนี้ เราเพียงแค่แก้ไขแนวคิดทั่วไปของการใช้ คุณสมบัติที่กล่าวมาเหล่านี้
นี่อาจเป็นหนึ่งในส่วนคำสั่ง Awk ที่ง่ายที่สุดในการทำความเข้าใจ ดังนั้นนั่งลงและไปดำเนินการต่อได้เลย
1. ตัวแปร Awk
ในภาษาการเขียนโปรแกรมใดๆ ตัวแปรคือตัวยึดตำแหน่งที่เก็บค่า เมื่อคุณสร้างตัวแปรในไฟล์โปรแกรม ขณะที่ไฟล์ถูกดำเนินการ พื้นที่บางส่วนจะถูกสร้างขึ้นในหน่วยความจำซึ่งจะจัดเก็บค่าที่คุณระบุสำหรับตัวแปร
คุณสามารถกำหนดตัวแปร Awk ได้ในลักษณะเดียวกับที่คุณกำหนดตัวแปรเชลล์ดังนี้:
variable_name=value
ในไวยากรณ์ด้านบน:
variable_name
: คือชื่อที่คุณตั้งให้กับตัวแปร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 นิพจน์ตัวเลขจะถูกสร้างขึ้นโดยใช้ตัวดำเนินการตัวเลขต่อไปนี้:
*
: ตัวดำเนินการคูณ+
: ตัวดำเนินการเพิ่มเติม/
: ตัวดำเนินการหาร-
: ตัวดำเนินการลบ%
: ตัวดำเนินการโมดูลัส^
: ตัวดำเนินการยกกำลัง
ไวยากรณ์สำหรับนิพจน์ตัวเลขคือ:
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 และซึ่งรวมถึงสิ่งต่อไปนี้:
*=
: ตัวดำเนินการกำหนดสูตรคูณ+=
: ตัวดำเนินการกำหนดเพิ่มเติม/=
: ผู้ดำเนินการกำหนดแผนก-=
: ตัวดำเนินการกำหนดการลบ%=
: ตัวดำเนินการกำหนดโมดูลัส^=
: ตัวดำเนินการกำหนดเลขยกกำลัง
ไวยากรณ์ที่ง่ายที่สุดของการดำเนินการมอบหมายงานใน 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