มีเครื่องมือยูทิลิตี้มากมายในระบบปฏิบัติการ Linux เพื่อค้นหาและสร้างรายงานจากข้อมูลข้อความหรือไฟล์ ผู้ใช้สามารถดำเนินการค้นหา แทนที่ และสร้างรายงานได้หลายประเภทโดยใช้คำสั่ง awk, grep และ sed awk ไม่ใช่แค่คำสั่ง เป็นภาษาสคริปต์ที่สามารถใช้ได้ทั้งจากเทอร์มินัลและไฟล์ awk รองรับตัวแปร, คำสั่งเงื่อนไข, อาร์เรย์, ลูป ฯลฯ เช่นเดียวกับภาษาสคริปต์อื่นๆ สามารถอ่านเนื้อหาไฟล์ทีละบรรทัด และแยกฟิลด์หรือคอลัมน์ตามตัวคั่นเฉพาะ นอกจากนี้ยังรองรับนิพจน์ทั่วไปสำหรับการค้นหาสตริงเฉพาะในเนื้อหาข้อความหรือไฟล์ และดำเนินการหากพบการจับคู่ใดๆ วิธีใช้คำสั่ง awk และสคริปต์จะแสดงในบทช่วยสอนนี้โดยใช้ตัวอย่างที่มีประโยชน์ 20 ตัวอย่าง
สารบัญ:
- awk กับ printf
- awk เพื่อแยกบนพื้นที่สีขาว
- awk เพื่อเปลี่ยนตัวคั่น
- awk พร้อมข้อมูลคั่นด้วยแท็บ
- awk ด้วยข้อมูล csv
- awk regex
- awk ตัวพิมพ์เล็กและตัวพิมพ์เล็ก regex
- awk พร้อมตัวแปร nf (จำนวนฟิลด์)
- awk gensub () ฟังก์ชั่น
- awk พร้อมฟังก์ชัน rand()
- awk ผู้ใช้กำหนดฟังก์ชั่น
- awk ถ้า
- ตัวแปร awk
- awk arrays
- awk ลูป
- awk เพื่อพิมพ์คอลัมน์แรก
- awk เพื่อพิมพ์คอลัมน์สุดท้าย
- awk กับ grep
- awk ด้วยไฟล์สคริปต์ทุบตี
- awk กับ sed
ใช้ awk กับ printf
พิมพ์f() ฟังก์ชันใช้เพื่อจัดรูปแบบเอาต์พุตในภาษาการเขียนโปรแกรมส่วนใหญ่ ฟังก์ชันนี้ใช้ได้กับ awk คำสั่งสร้างเอาต์พุตรูปแบบต่างๆ คำสั่ง awk ส่วนใหญ่ใช้สำหรับไฟล์ข้อความใด ๆ สร้างไฟล์ข้อความชื่อ พนักงาน.txt ด้วยเนื้อหาที่ระบุด้านล่างโดยคั่นฟิลด์ด้วยแท็บ (' ')
พนักงาน.txt
1001 ยอห์น เสนา 40000
1002 จาฟาร์ อิกบัล 60000
1003 เมเฮอร์ นิการ์ 30000
1004 จอนนี่ ลิเวอร์ 70000
คำสั่ง awk ต่อไปนี้จะอ่านข้อมูลจาก พนักงาน.txt ไฟล์ทีละบรรทัดและพิมพ์ไฟล์แรกหลังการจัดรูปแบบ ที่นี่, %10 วินาที หมายความว่าผลลัพธ์จะมีความยาว 10 อักขระ หากค่าของเอาต์พุตน้อยกว่า 10 อักขระ จะมีการเว้นวรรคที่ด้านหน้าของค่า
$ awk'{ printf '%10sNS', $ 1}'พนักงาน.txt
เอาท์พุท:
awk เพื่อแยกบนพื้นที่สีขาว
ตัวคั่นคำหรือช่องเริ่มต้นสำหรับการแยกข้อความใดๆ คือช่องว่างสีขาว คำสั่ง awk สามารถรับค่าข้อความเป็นอินพุตได้หลายวิธี ข้อความอินพุตถูกส่งผ่านจาก โยนออก คำสั่งในตัวอย่างต่อไปนี้ ข้อความ, ' ฉันชอบเขียนโปรแกรม ' จะถูกแบ่งโดยตัวคั่นเริ่มต้น ช่องว่าง และคำที่สามจะถูกพิมพ์ออกมาเป็นผลลัพธ์
$โยนออก 'ฉันชอบเขียนโปรแกรม' | awk '{ พิมพ์ $3 }'เอาท์พุท:
awk เพื่อเปลี่ยนตัวคั่น
คำสั่ง awk สามารถใช้เพื่อเปลี่ยนตัวคั่นสำหรับเนื้อหาไฟล์ใดๆ สมมติว่าคุณมีไฟล์ข้อความชื่อ phone.txt ด้วยเนื้อหาต่อไปนี้โดยที่ ':' ถูกใช้เป็นตัวคั่นฟิลด์ของเนื้อหาไฟล์
phone.txt
+123: 334: 889: 778+880: 1855: 456: 907
+9: 7777: 38644: 808
รันคำสั่ง awk ต่อไปนี้เพื่อเปลี่ยนตัวคั่น ':' โดย '-' ไปยังเนื้อหาของไฟล์ phone.txt .
$ cat phone.txt$ awk '$1=$1' FS=':' OFS='-' phone.txt
เอาท์พุท:
awk พร้อมข้อมูลคั่นด้วยแท็บ
คำสั่ง awk มีตัวแปรบิวท์อินมากมายที่ใช้ในการอ่านข้อความในรูปแบบต่างๆ สองคนนั้นคือ FS และ OFS . FS เป็นตัวคั่นฟิลด์อินพุตและ OFS เป็นตัวแปรตัวคั่นฟิลด์เอาต์พุต การใช้ตัวแปรเหล่านี้แสดงไว้ในส่วนนี้ สร้าง แท็บ แยกไฟล์ชื่อ input.txt ด้วยเนื้อหาต่อไปนี้เพื่อทดสอบการใช้งานของ FS และ OFS ตัวแปร
Input.txt
ภาษาสคริปต์ฝั่งไคลเอ็นต์ภาษาสคริปต์ฝั่งเซิร์ฟเวอร์
เซิร์ฟเวอร์ฐานข้อมูล
เว็บเซิร์ฟเวอร์
การใช้ตัวแปร FS กับ tab
คำสั่งต่อไปนี้จะแยกแต่ละบรรทัดของ input.txt ไฟล์ตามแท็บ (' ') และพิมพ์ฟิลด์แรกของแต่ละบรรทัด
$awk '{ พิมพ์ $1 }' FS='NS'input.txtเอาท์พุท:
การใช้ตัวแปร OFS กับ tab
คำสั่ง awk ต่อไปนี้จะพิมพ์ 9NS และ 5NS สาขาของ 'ล-ล' เอาต์พุตคำสั่งพร้อมตัวคั่นแท็บหลังจากพิมพ์ชื่อคอลัมน์ ชื่อ และ ขนาด . ที่นี่, OFS ตัวแปรใช้เพื่อจัดรูปแบบผลลัพธ์โดยแท็บ
$ลส -NS$ลส -NS | awk -v OFS='NS' 'เริ่มต้น { พิมพ์ '%s %s ', 'ชื่อ', 'ขนาด'} {พิมพ์ $9,$5}'
เอาท์พุท:
awk ด้วยข้อมูล CSV
เนื้อหาของไฟล์ CSV สามารถแยกวิเคราะห์ได้หลายวิธีโดยใช้คำสั่ง awk สร้างไฟล์ CSV ชื่อ ' ลูกค้า.csv ’ ด้วยเนื้อหาต่อไปนี้เพื่อใช้คำสั่ง awk
ลูกค้า.txt
ID, ชื่อ, อีเมล, โทรศัพท์1, โซเฟีย, [ป้องกันอีเมล] , (862) 478-7263
2, Amelia, [ป้องกันอีเมล] , (530) 764-8000
3, เอ็มม่า, [ป้องกันอีเมล] , (542) 986-2390
กำลังอ่านไฟล์ CSV ฟิลด์เดียว
'-NS' ตัวเลือกใช้กับคำสั่ง awk เพื่อตั้งค่าตัวคั่นสำหรับแยกแต่ละบรรทัดของไฟล์ คำสั่ง awk ต่อไปนี้จะพิมพ์ ชื่อ ที่ดินของ ลูกค้า.csv ไฟล์.
$แมวลูกค้า.csv$awk -NS ',' '{พิมพ์ $2}'ลูกค้า.csv
เอาท์พุท:
การอ่านหลายช่องโดยรวมกับข้อความอื่น
คำสั่งต่อไปนี้จะพิมพ์สามช่องของ ลูกค้า.csv โดยการรวมข้อความชื่อเรื่อง ชื่อ อีเมล และโทรศัพท์ . บรรทัดแรกของ ลูกค้า.csv ไฟล์มีชื่อของแต่ละฟิลด์ ไม่ ตัวแปรมีหมายเลขบรรทัดของไฟล์เมื่อคำสั่ง awk แยกวิเคราะห์ไฟล์ ในตัวอย่างนี้ NR ตัวแปรใช้เพื่อละเว้นบรรทัดแรกของไฟล์ ผลลัพธ์จะแสดง2NS, 3rdและ 4NSช่องของทุกบรรทัดยกเว้นบรรทัดแรก
$awk -NS ',' 'NR>1 {พิมพ์ 'ชื่อ:' $2 ', อีเมล:' $3 ', โทรศัพท์:' $4}'ลูกค้า.csvเอาท์พุท:
การอ่านไฟล์ CSV โดยใช้สคริปต์ awk
สคริปต์ awk สามารถเรียกใช้ได้โดยการเรียกใช้ไฟล์ awk วิธีที่คุณสามารถสร้างไฟล์ awk และรันไฟล์นั้นแสดงอยู่ในตัวอย่างนี้ สร้างไฟล์ชื่อ awkcsv.awk ด้วยรหัสต่อไปนี้ เริ่ม คีย์เวิร์ดใช้ในสคริปต์เพื่อแจ้งคำสั่ง awk เพื่อรันสคริปต์ของ เริ่ม ส่วนแรกก่อนที่จะดำเนินการอื่น ๆ ที่นี่ ตัวคั่นฟิลด์ ( FS ) ใช้เพื่อกำหนดตัวคั่นแยกและ2NSและ 1เซนต์ฟิลด์จะถูกพิมพ์ตามรูปแบบที่ใช้ในฟังก์ชัน printf()
awkcsvawkเริ่ม{FS= ','} { printf '% 5 วินาที (% วินาที)NS',$2,$1}
วิ่ง awkcsv.awk ไฟล์ที่มีเนื้อหาของ ลูกค้า.csv ไฟล์โดยคำสั่งต่อไปนี้
$awk -NSawkcsv.awk ลูกค้า.csvเอาท์พุท:
awk regex
นิพจน์ทั่วไปเป็นรูปแบบที่ใช้เพื่อค้นหาสตริงใดๆ ในข้อความ งานการค้นหาและแทนที่ที่ซับซ้อนประเภทต่างๆ สามารถทำได้ง่ายมากโดยใช้นิพจน์ทั่วไป การใช้นิพจน์ทั่วไปอย่างง่ายด้วยคำสั่ง awk จะแสดงในส่วนนี้
จับคู่ตัวอักษรชุดคำสั่งต่อไปนี้จะตรงกับคำว่า โง่หรือโง่ หรือ เย็น ด้วยสตริงอินพุตและพิมพ์หากพบคำ ที่นี่, ตุ๊กตา จะไม่ตรงกันและไม่พิมพ์
$printf 'คนโง่NSเย็นNSตุ๊กตาNSบูล' | awk '/[FbC]อู๋/'เอาท์พุท:
ค้นหาสตริงที่จุดเริ่มต้นของบรรทัด
'^' สัญลักษณ์ถูกใช้ในนิพจน์ทั่วไปเพื่อค้นหารูปแบบใดๆ ที่จุดเริ่มต้นของบรรทัด ' ลินุกซ์' คำจะถูกค้นหาที่จุดเริ่มต้นของแต่ละบรรทัดของข้อความในตัวอย่างต่อไปนี้ ในที่นี้ สองบรรทัดเริ่มต้นด้วยข้อความ 'ลินุกซ์ ’ และสองบรรทัดนั้นจะแสดงในผลลัพธ์
$โยนออก -และ 'ลินุกซ์ใช้งานได้ฟรีNSเป็นซอฟต์แวร์โอเพ่นซอร์สNSLinuxHint คือเว็บไซต์บล็อกยอดนิยม' | awk '/^ลินุกซ์/'
เอาท์พุท:
ค้นหาสตริงที่ท้ายบรรทัด
'$' สัญลักษณ์ถูกใช้ในนิพจน์ทั่วไปเพื่อค้นหารูปแบบใดๆ ที่ส่วนท้ายของแต่ละบรรทัดของข้อความ ' สคริปต์ ' คำจะถูกค้นหาในตัวอย่างต่อไปนี้ ในที่นี้ สองบรรทัดมีคำว่า สคริปต์ ที่ท้ายบรรทัด
$โยนออก -และ 'สคริปต์ PHPNSJavaScriptNSการเขียนโปรแกรมเชิงภาพ' | awk '/สคริปต์$/'เอาท์พุท:
ค้นหาโดยละเว้นชุดอักขระเฉพาะ
'^' สัญลักษณ์แสดงถึงการเริ่มต้นของข้อความเมื่อใช้ข้างหน้ารูปแบบสตริงใด ๆ ('/ ^… /') หรือก่อนชุดอักขระใด ๆ ที่ประกาศโดย ^ […] . ถ้า '^' สัญลักษณ์ถูกใช้ภายในวงเล็บเหลี่ยมที่สาม [^…] จากนั้นชุดอักขระที่กำหนดไว้ภายในวงเล็บจะถูกละเว้นในขณะที่ทำการค้นหา คำสั่งต่อไปนี้จะค้นหาคำใด ๆ ที่ไม่ได้ขึ้นต้นด้วย 'NS' แต่ลงท้ายด้วย' ool '. เย็น และ bool จะพิมพ์ตามรูปแบบและข้อมูลข้อความ
$ printf 'คนโง่NSเย็นNSตุ๊กตาNSบูล' |awk'/ [^ F] อู๋ /'เอาท์พุท:
awk ตัวพิมพ์เล็กและตัวพิมพ์เล็ก regex
โดยค่าเริ่มต้น นิพจน์ทั่วไปจะทำการค้นหาโดยคำนึงถึงขนาดตัวพิมพ์เมื่อค้นหารูปแบบใดๆ ในสตริง การค้นหาที่ไม่คำนึงถึงขนาดตัวพิมพ์สามารถทำได้โดยคำสั่ง awk ด้วยนิพจน์ทั่วไป ในตัวอย่างต่อไปนี้ tolower() ฟังก์ชันจะใช้ในการค้นหาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ที่นี่ คำแรกของแต่ละบรรทัดของข้อความที่ป้อนจะถูกแปลงเป็นตัวพิมพ์เล็กโดยใช้ tolower() ฟังก์ชันและจับคู่กับรูปแบบนิพจน์ทั่วไป ท็อปเปอร์() สามารถใช้ฟังก์ชันเพื่อจุดประสงค์นี้ได้ ในกรณีนี้ รูปแบบจะต้องกำหนดด้วยตัวพิมพ์ใหญ่ทั้งหมด ข้อความที่กำหนดไว้ในตัวอย่างต่อไปนี้ประกอบด้วยคำค้นหา 'เว็บ ’ ในสองบรรทัดซึ่งจะถูกพิมพ์ออกมาเป็นเอาต์พุต
$โยนออก -และ 'การออกแบบเว็บNSการพัฒนาเว็บNSกรอบ' | awk 'tolower($0) ~ /^web/;'เอาท์พุท:
awk พร้อมตัวแปร NF (จำนวนฟิลด์)
NF เป็นตัวแปรในตัวของคำสั่ง awk ซึ่งใช้ในการนับจำนวนฟิลด์ทั้งหมดในแต่ละบรรทัดของข้อความอินพุต สร้างไฟล์ข้อความที่มีหลายบรรทัดและหลายคำ input.txt ไฟล์ถูกใช้ที่นี่ซึ่งสร้างขึ้นในตัวอย่างก่อนหน้านี้
การใช้ NF จากบรรทัดคำสั่ง
ในที่นี้ คำสั่งแรกใช้เพื่อแสดงเนื้อหาของ input.txt file และคำสั่งที่สองใช้เพื่อแสดงจำนวนฟิลด์ทั้งหมดในแต่ละบรรทัดของไฟล์โดยใช้ NF ตัวแปร.
$ cat input.txt$ awk '{พิมพ์ NF}' input.txt
เอาท์พุท:
การใช้ NF ในไฟล์ awk
สร้างไฟล์ awk ชื่อ นับ.awk ด้วยสคริปท์ด้านล่าง เมื่อสคริปต์นี้จะดำเนินการกับข้อมูลข้อความใดๆ เนื้อหาแต่ละบรรทัดที่มีฟิลด์ทั้งหมดจะถูกพิมพ์ออกมาเป็นเอาต์พุต
นับ.awk
{พิมพ์ $0}{พิมพ์'[ฟิลด์ทั้งหมด:'NF']'}
รันสคริปต์ด้วยคำสั่งต่อไปนี้
$awk -NScount.awk input.txtเอาท์พุท:
awk gensub () ฟังก์ชั่น
getsub() เป็นฟังก์ชันการแทนที่ที่ใช้เพื่อค้นหาสตริงตามตัวคั่นเฉพาะหรือรูปแบบนิพจน์ทั่วไป ฟังก์ชันนี้ถูกกำหนดใน 'อ้าปากค้าง' แพ็คเกจที่ไม่ได้ติดตั้งไว้ตามค่าเริ่มต้น ไวยากรณ์สำหรับฟังก์ชันนี้ได้รับด้านล่าง พารามิเตอร์แรกมีรูปแบบนิพจน์ทั่วไปหรือตัวคั่นการค้นหา พารามิเตอร์ที่สองมีข้อความแทนที่ พารามิเตอร์ที่สามระบุว่าจะทำการค้นหาอย่างไร และพารามิเตอร์สุดท้ายมีข้อความที่จะใช้ฟังก์ชันนี้
ไวยากรณ์:
เก็นซับ(regexp แทน วิธีการ[, เป้า])เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้ง เพ่งพิศ แพ็คเกจสำหรับใช้ getsub() ทำงานด้วยคำสั่ง awk
$ sudo apt-get ติดตั้ง gawkสร้างไฟล์ข้อความชื่อ ' salesinfo.txt ’ ด้วยเนื้อหาต่อไปนี้เพื่อฝึกตัวอย่างนี้ ที่นี่ ฟิลด์จะถูกคั่นด้วยแท็บ
salesinfo.txt
700000 ของฉันของคุณ 8000000
พ. 750000
สะสม 200,000
ศ. 430000
ส. 820000
เรียกใช้คำสั่งต่อไปนี้เพื่ออ่านฟิลด์ตัวเลขของ salesinfo.txt ไฟล์และพิมพ์ยอดรวมของยอดขายทั้งหมด ในที่นี้ พารามิเตอร์ที่สาม 'G' หมายถึงการค้นหาทั่วโลก นั่นหมายความว่ารูปแบบจะถูกค้นหาในเนื้อหาทั้งหมดของไฟล์
$awk '{ x=gensub(' ','','G',$2); printf x '+' } END { พิมพ์ 0 }'salesinfo.txt| bc -NSเอาท์พุท:
awk พร้อมฟังก์ชัน rand()
แถว() ฟังก์ชันใช้สร้างตัวเลขสุ่มใดๆ ที่มากกว่า 0 และน้อยกว่า 1 ดังนั้น จะสร้างตัวเลขเศษส่วนน้อยกว่า 1 เสมอ คำสั่งต่อไปนี้จะสร้างตัวเลขสุ่มเศษส่วนและคูณค่าด้วย 10 เพื่อให้ได้ตัวเลขที่มากกว่า 1. ระบบจะพิมพ์ตัวเลขเศษส่วนที่มีตัวเลขสองหลักหลังจุดทศนิยมเพื่อใช้ฟังก์ชัน printf() หากคุณเรียกใช้คำสั่งต่อไปนี้หลายครั้ง คุณจะได้ผลลัพธ์ที่แตกต่างกันทุกครั้ง
$awk 'เริ่มต้น {printf 'Number is =%.2f ' , rand()*10}'เอาท์พุท:
awk ผู้ใช้กำหนดฟังก์ชั่น
ฟังก์ชันทั้งหมดที่ใช้ในตัวอย่างก่อนหน้านี้เป็นฟังก์ชันในตัว แต่คุณสามารถประกาศฟังก์ชันที่ผู้ใช้กำหนดในสคริปต์ awk เพื่อทำงานเฉพาะใดๆ ได้ สมมติว่า คุณต้องการสร้างฟังก์ชันแบบกำหนดเองเพื่อคำนวณพื้นที่ของสี่เหลี่ยมผืนผ้า ในการดำเนินการนี้ ให้สร้างไฟล์ชื่อ ' area.awk ’ ด้วยสคริปต์ต่อไปนี้ ในตัวอย่างนี้ ฟังก์ชันที่ผู้ใช้กำหนดชื่อ พื้นที่() ถูกประกาศในสคริปต์ที่คำนวณพื้นที่ตามพารามิเตอร์อินพุตและส่งกลับค่าพื้นที่ getline คำสั่งใช้ที่นี่เพื่อรับข้อมูลจากผู้ใช้
area.awk
#คำนวณพื้นที่การทำงานพื้นที่(ความสูง,ความกว้าง){
กลับความสูง*ความกว้าง
}
#เริ่มดำเนินการ
เริ่ม{
พิมพ์'ป้อนค่าความสูง:'
getline h< '-'
พิมพ์'ป้อนค่าความกว้าง:'
getline w< '-'
พิมพ์'พื้นที่ = 'พื้นที่(ชม,ใน)
}
เรียกใช้สคริปต์
$awk -NSarea.awkเอาท์พุท:
awk ถ้าตัวอย่าง
awk รองรับคำสั่งแบบมีเงื่อนไขเหมือนกับภาษาโปรแกรมมาตรฐานอื่นๆ คำสั่ง if สามประเภทจะแสดงในส่วนนี้โดยใช้ตัวอย่างสามตัวอย่าง สร้างไฟล์ข้อความชื่อ items.txt โดยมีเนื้อหาดังต่อไปนี้
items.txt
HDD Samsung $100เมาส์ A4Tech
เครื่องพิมพ์ HP $200
ง่ายถ้าตัวอย่าง :
เขาทำตามคำสั่งจะอ่านเนื้อหาของ items.txt ไฟล์และตรวจสอบ 3rd ค่าฟิลด์ในแต่ละบรรทัด หากค่าว่างเปล่า ระบบจะพิมพ์ข้อความแสดงข้อผิดพลาดพร้อมหมายเลขบรรทัด
$awk '{ if ($3 == '') พิมพ์ 'ไม่มีฟิลด์ราคาในบรรทัด ' NR }'items.txtเอาท์พุท:
ตัวอย่างถ้าเป็นอย่างอื่น:
คำสั่งต่อไปนี้จะพิมพ์ราคาสินค้าหาก 3rdมีฟิลด์อยู่ในบรรทัด มิฉะนั้น จะพิมพ์ข้อความแสดงข้อผิดพลาด
$ awk'{ if ($ 3 == '') พิมพ์ 'ไม่มีฟิลด์ราคา'อื่น พิมพ์ 'ราคาสินค้าคือ ' $3 }'รายการtxt
เอาท์พุท:
if-else-if ตัวอย่าง:
เมื่อคำสั่งต่อไปนี้จะรันจากเทอร์มินัล คำสั่งนั้นจะรับอินพุตจากผู้ใช้ ค่าอินพุตจะถูกเปรียบเทียบกับแต่ละเงื่อนไข if จนกว่าเงื่อนไขจะเป็นจริง หากเงื่อนไขใด ๆ กลายเป็นจริงก็จะพิมพ์เกรดที่เกี่ยวข้อง หากค่าที่ป้อนไม่ตรงกับเงื่อนไขใด ๆ ก็จะพิมพ์ไม่สำเร็จ
$awk 'เริ่มต้น { พิมพ์ 'ป้อนเครื่องหมาย:'เครื่องหมายเส้น<'-'
ถ้า (เครื่องหมาย >= 90) พิมพ์ 'A+'
อื่นถ้า (เครื่องหมาย >= 80) พิมพ์ 'A'
อื่นถ้า (เครื่องหมาย >= 70) พิมพ์ 'B+'
อื่นพิมพ์ 'ล้มเหลว' }'
เอาท์พุท:
ตัวแปร awk
การประกาศตัวแปร awk คล้ายกับการประกาศตัวแปรเชลล์ มีความแตกต่างในการอ่านค่าของตัวแปร สัญลักษณ์ '$' ใช้กับชื่อตัวแปรสำหรับตัวแปรเชลล์เพื่ออ่านค่า แต่ไม่จำเป็นต้องใช้ '$' กับตัวแปร awk เพื่ออ่านค่า
ใช้ตัวแปรอย่างง่าย:
คำสั่งต่อไปนี้จะประกาศตัวแปรชื่อ 'งาน' และค่าสตริงถูกกำหนดให้กับตัวแปรนั้น ค่าของตัวแปรจะถูกพิมพ์ในคำสั่งถัดไป
$awk 'BEGIN{ ไซต์='LinuxHint.com'; พิมพ์ไซต์}'เอาท์พุท:
การใช้ตัวแปรดึงข้อมูลจากไฟล์
คำสั่งต่อไปนี้จะค้นหาคำว่า 'เครื่องพิมพ์' ในไฟล์ items.txt . หากบรรทัดใดของไฟล์ขึ้นต้นด้วย 'เครื่องพิมพ์ ’ แล้วมันจะเก็บค่าของ 1เซนต์ , 2NS และ 3rd ฟิลด์ออกเป็นสามตัวแปร ชื่อ และ ราคา ตัวแปรจะถูกพิมพ์
$ awk'/เครื่องพิมพ์/ { name=$1;brand=$2;price=$3;print 'item ราคาสินค้า=' ราคา }'รายการtxtเอาท์พุท:
awk arrays
ทั้งตัวเลขและอาร์เรย์ที่เกี่ยวข้องสามารถใช้ได้ใน awk การประกาศตัวแปรอาร์เรย์ใน awk จะเหมือนกับภาษาโปรแกรมอื่นๆ การใช้งานอาร์เรย์บางส่วนจะแสดงในส่วนนี้
อาร์เรย์ที่เชื่อมโยง:
ดัชนีของอาร์เรย์จะเป็นสตริงใดๆ สำหรับอาเรย์ที่เชื่อมโยง ในตัวอย่างนี้ อาร์เรย์ที่เชื่อมโยงของสามองค์ประกอบจะถูกประกาศและพิมพ์
$awk 'เริ่ม {books['Web Design'] = 'การเรียนรู้ HTML 5';
books['Web Programming'] = 'PHP และ MySQL'
หนังสือ['PHP Framework']='การเรียนรู้ Laravel 5'
printf '%s %s %s ', หนังสือ['การออกแบบเว็บ'], หนังสือ['การเขียนโปรแกรมเว็บ'],
หนังสือ['PHP Framework'] }'
เอาท์พุท:
อาร์เรย์ตัวเลข:
อาร์เรย์ตัวเลขของสามองค์ประกอบถูกประกาศและพิมพ์โดยแยกแท็บ
$ awk'เริ่ม {ตัวเลข[0] = 80;
ตัวเลข [1] = 55;
ตัวเลข [2] = 76;
# พิมพ์องค์ประกอบอาร์เรย์
printf 'ค่าอาร์เรย์: %dNS%NSNS%NSNS', หมายเลข[0],หมายเลข[1],หมายเลข[2]; }'
เอาท์พุท:
awk ลูป
awk รองรับลูปสามประเภท การใช้ลูปเหล่านี้แสดงไว้ที่นี่โดยใช้ตัวอย่างสามตัวอย่าง
ในขณะที่วนซ้ำ:
ในขณะที่ลูปที่ใช้ในคำสั่งต่อไปนี้จะวนซ้ำ 5 ครั้งและออกจากลูปสำหรับคำสั่ง break
$ awk 'เริ่มต้น { n = 1; ในขณะที่ (n 5) แตก; พิมพ์ n; n++ } }'เอาท์พุท:
สำหรับลูป:
สำหรับลูปที่ใช้ในคำสั่ง awk ต่อไปนี้จะคำนวณผลรวมตั้งแต่ 1 ถึง 10 แล้วพิมพ์ค่า
$awk 'เริ่มต้น { ผลรวม = 0; สำหรับ (n = 1; n<= 10; n++) sum=sum+n; print sum }'เอาท์พุท:
ทำในขณะที่วนซ้ำ:
do-while loop ของคำสั่งต่อไปนี้จะพิมพ์เลขคู่ทั้งหมดตั้งแต่ 10 ถึง 5
$awk 'เริ่มต้น {ตัวนับ = 10; ทำ { ถ้า (ตัวนับ%2 ==0) ตัวนับการพิมพ์; เคาน์เตอร์-- }ในขณะที่ (ตัวนับ > 5) }'
เอาท์พุท:
awk เพื่อพิมพ์คอลัมน์แรก
คอลัมน์แรกของไฟล์ใดๆ สามารถพิมพ์ได้โดยใช้ตัวแปร $1 ใน awk แต่ถ้าค่าของคอลัมน์แรกมีหลายคำ เฉพาะคำแรกของคอลัมน์แรกเท่านั้นที่จะพิมพ์ออกมา โดยใช้ตัวคั่นเฉพาะ คอลัมน์แรกสามารถพิมพ์ได้อย่างถูกต้อง สร้างไฟล์ข้อความชื่อ นักเรียน.txt โดยมีเนื้อหาดังต่อไปนี้ ในที่นี้ คอลัมน์แรกมีข้อความสองคำ
นักเรียน.txt
Kaniz Fatema 30NSแบทช์อาบีร์ โฮสเซน 35NSแบทช์
จอห์น อับราฮัม 40NSแบทช์
รันคำสั่ง awk โดยไม่มีตัวคั่น ส่วนแรกของคอลัมน์แรกจะถูกพิมพ์
$awk '{พิมพ์ $1}'นักเรียน.txtรันคำสั่ง awk ด้วยตัวคั่นต่อไปนี้ ส่วนเต็มของคอลัมน์แรกจะถูกพิมพ์
$awk -NS '\ NS' '{พิมพ์ $1}'นักเรียน.txtเอาท์พุท:
awk เพื่อพิมพ์คอลัมน์สุดท้าย
$(NF) ตัวแปรสามารถใช้เพื่อพิมพ์คอลัมน์สุดท้ายของไฟล์ใดก็ได้ คำสั่ง awk ต่อไปนี้จะพิมพ์ส่วนสุดท้ายและส่วนเต็มของคอลัมน์สุดท้ายของ นักเรียน.txt ไฟล์.
$awk '{พิมพ์ $(NF)}'นักเรียน.txt$awk -NS '\ NS' '{พิมพ์ $(NF)}'นักเรียน.txt
เอาท์พุท:
awk กับ grep
grep เป็นคำสั่งที่มีประโยชน์อีกอย่างหนึ่งของ Linux ในการค้นหาเนื้อหาในไฟล์ตามนิพจน์ทั่วไป วิธีที่ทั้งคำสั่ง awk และ grep สามารถใช้ร่วมกันได้ในตัวอย่างต่อไปนี้ กริป คำสั่งใช้ค้นหาข้อมูล id พนักงาน' 1002 ' จาก พนักงาน.txt ไฟล์. เอาต์พุตของคำสั่ง grep จะถูกส่งไปยัง awk เป็นข้อมูลอินพุต โบนัส 5% จะถูกนับและพิมพ์ตามเงินเดือนของรหัสพนักงาน ‘ 1002 ' โดยคำสั่ง awk
$แมวพนักงาน.txt$กริป '1002'พนักงาน.txt| awk -NS 'NS' '{ พิมพ์ $2 ' จะได้รับ $' ($ 3 * 5)/100 ' โบนัส'}'
เอาท์พุท:
awk ด้วยไฟล์ BASH
เช่นเดียวกับคำสั่ง Linux คำสั่ง awk ยังสามารถใช้ในสคริปต์ BASH สร้างไฟล์ข้อความชื่อ ลูกค้า.txt โดยมีเนื้อหาดังต่อไปนี้ แต่ละบรรทัดของไฟล์นี้มีข้อมูลเกี่ยวกับสี่ฟิลด์ คือ ID ลูกค้า ชื่อ ที่อยู่ และเบอร์มือถือ คั่นด้วย '/ '.
ลูกค้า.txt
AL4934 / Charles M Brunner / 4838 Beeghley Street, Huntsville, Alabama / 256-671-7942CA5455 / Virginia S Mota / 930 Bassel Street,วัลเลซิโต,แคลิฟอร์เนีย / 415-679-5908
IL4855 / Ann A Neale / 1932 Patterson Fork Road, ชิคาโก, อิลลินอยส์ / 773-550-5107
สร้างไฟล์ทุบตีชื่อ item_search.bash ด้วยสคริปต์ต่อไปนี้ ตามสคริปต์นี้ ค่าสถานะจะถูกนำมาจากผู้ใช้และค้นหาใน ลูกค้า.txt ไฟล์โดย กริป คำสั่งและส่งผ่านไปยังคำสั่ง awk เป็นอินพุต คำสั่ง awk จะอ่าน 2NS และ 4NS ฟิลด์ของแต่ละบรรทัด หากค่าอินพุตตรงกับค่าสถานะใดๆ ของ ลูกค้า.txt ไฟล์แล้วมันจะพิมพ์ของลูกค้า ชื่อ และ เบอร์มือถือ มิฉะนั้นจะพิมพ์ข้อความ ไม่พบลูกค้า .
item_search.bash
#!/bin/bashโยนออก 'ป้อนชื่อรัฐ:'
อ่านสถานะ
ลูกค้า=``กริป '$state'ลูกค้า.txt| awk -NS '/' '{พิมพ์ 'ชื่อลูกค้า:' $2, ',
เบอร์มือถือ:' $4}'``
ถ้า [ '$ลูกค้า' !='' ];แล้ว
โยนออก $ลูกค้า
อื่น
โยนออก 'ไม่พบลูกค้า'
เป็น
รันคำสั่งต่อไปนี้เพื่อแสดงผลลัพธ์
$แมวลูกค้า.txt$ทุบตีitem_search.bash
เอาท์พุท:
awk กับ sed
เครื่องมือค้นหาที่มีประโยชน์อีกอย่างของ Linux คือ sed . คำสั่งนี้สามารถใช้ได้ทั้งการค้นหาและแทนที่ข้อความของไฟล์ใดๆ ตัวอย่างต่อไปนี้แสดงการใช้คำสั่ง awk with sed สั่งการ. ที่นี่คำสั่ง sed จะค้นหาชื่อพนักงานทั้งหมดที่ขึ้นต้นด้วย ' NS ’ และส่งผ่านไปยังคำสั่ง awk เป็นอินพุต awk จะพิมพ์พนักงาน ชื่อ และ NS หลังจากการจัดรูปแบบ
$แมวพนักงาน.txt$sed -NS '/เจ/พี'พนักงาน.txt| awk -NS 'NS' '{ printf '%s(%s) ', $2, $1 }'
เอาท์พุท:
บทสรุป:
คุณสามารถใช้คำสั่ง awk เพื่อสร้างรายงานประเภทต่างๆ ตามข้อมูลแบบตารางหรือแบบคั่นหลังจากกรองข้อมูลอย่างถูกต้อง หวังว่าคุณจะสามารถเรียนรู้วิธีการทำงานของคำสั่ง awk หลังจากฝึกตัวอย่างที่แสดงในบทช่วยสอนนี้