AWK - ตัวแปรในตัว
AWK มีตัวแปรในตัวหลายตัว พวกเขามีบทบาทสำคัญในขณะที่เขียนสคริปต์ AWK บทนี้แสดงให้เห็นถึงการใช้งานตัวแปรในตัว
ตัวแปร AWK มาตรฐาน
ตัวแปร AWK มาตรฐานจะกล่าวถึงด้านล่าง
ARGC
หมายถึงจำนวนอาร์กิวเมนต์ที่ให้ไว้ที่บรรทัดคำสั่ง
Example
[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
Arguments = 5
แต่ทำไม AWK ถึงแสดง 5 เมื่อคุณส่งผ่านข้อโต้แย้งเพียง 4 ข้อ เพียงตรวจสอบตัวอย่างต่อไปนี้เพื่อคลายข้อสงสัยของคุณ
ARGV
เป็นอาร์เรย์ที่เก็บอาร์กิวเมนต์บรรทัดคำสั่ง ดัชนีที่ถูกต้องของอาร์เรย์มีตั้งแต่ 0 ถึง ARGC-1
Example
[jerry]$ awk 'BEGIN {
for (i = 0; i < ARGC - 1; ++i) {
printf "ARGV[%d] = %s\n", i, ARGV[i]
}
}' one two three four
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
ARGV[0] = awk
ARGV[1] = one
ARGV[2] = two
ARGV[3] = three
CONVFMT
แสดงถึงรูปแบบการแปลงสำหรับตัวเลข ค่าเริ่มต้นคือ%.6g.
Example
[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
Conversion Format = %.6g
สิ่งแวดล้อม
มันเป็นอาร์เรย์ที่เชื่อมโยงของตัวแปรสภาพแวดล้อม
Example
[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
jerry
ในการค้นหาชื่อของตัวแปรสภาพแวดล้อมอื่น ๆ ให้ใช้ env คำสั่ง
ชื่อไฟล์
ซึ่งแสดงถึงชื่อไฟล์ปัจจุบัน
Example
[jerry]$ awk 'END {print FILENAME}' marks.txt
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
marks.txt
โปรดทราบว่า FILENAME ไม่ได้กำหนดไว้ในบล็อก BEGIN
FS
แสดงถึงตัวคั่นฟิลด์ (อินพุต) และค่าเริ่มต้นคือช่องว่าง คุณยังสามารถเปลี่ยนแปลงได้โดยใช้-F ตัวเลือกบรรทัดคำสั่ง
Example
[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
FS = $
NF
แสดงจำนวนฟิลด์ในระเบียนปัจจุบัน ตัวอย่างเช่นตัวอย่างต่อไปนี้จะพิมพ์เฉพาะบรรทัดที่มีมากกว่าสองฟิลด์
Example
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
One Two Three
One Two Three Four
NR
แสดงถึงจำนวนของระเบียนปัจจุบัน ตัวอย่างเช่นตัวอย่างต่อไปนี้จะพิมพ์ระเบียนหากหมายเลขระเบียนปัจจุบันน้อยกว่าสาม
Example
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
One Two
One Two Three
FNR
คล้ายกับ NR แต่สัมพันธ์กับไฟล์ปัจจุบัน จะมีประโยชน์เมื่อ AWK ทำงานกับไฟล์หลายไฟล์ ค่าของ FNR รีเซ็ตด้วยไฟล์ใหม่
OFMT
แสดงหมายเลขรูปแบบผลลัพธ์และค่าเริ่มต้นคือ %.6g.
Example
[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
OFMT = %.6g
OFS
แสดงถึงตัวคั่นฟิลด์เอาต์พุตและค่าดีฟอลต์คือช่องว่าง
Example
[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
OFS = $
ออส
แสดงถึงตัวคั่นเร็กคอร์ดเอาต์พุตและค่าดีฟอลต์คือ newline
Example
[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte
ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้ -
Output
ORS = $
$
RLENGTH
แสดงถึงความยาวของสตริงที่ตรงกับ matchฟังก์ชัน ฟังก์ชันจับคู่ของ AWK ค้นหาสตริงที่กำหนดในสตริงอินพุต
Example
[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
2
อาร์เอส
หมายถึงตัวคั่นเร็กคอร์ด (อินพุต) และค่าดีฟอลต์คือ newline
Example
[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
RS = $
$
RSTART
แสดงถึงตำแหน่งแรกในสตริงที่จับคู่ match ฟังก์ชัน
Example
[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
9
SUBSEP
แสดงถึงอักขระตัวคั่นสำหรับตัวห้อยอาร์เรย์และค่าดีฟอลต์คือ \034.
Example
[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
SUBSEP = ^\$
$ 0
แสดงถึงบันทึกข้อมูลเข้าทั้งหมด
Example
[jerry]$ awk '{print $0}' marks.txt
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
$ n
มันหมายถึง n THเขตข้อมูลในระเบียนปัจจุบันที่เขตข้อมูลจะถูกคั่นด้วย FS
Example
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
Physics 80
Maths 90
Biology 87
English 85
History 89
ตัวแปรเฉพาะของ GNU AWK
ตัวแปรเฉพาะของ GNU AWK มีดังนี้ -
ARGIND
แสดงดัชนีใน ARGV ของไฟล์ปัจจุบันที่กำลังประมวลผล
Example
[jerry]$ awk '{
print "ARGIND = ", ARGIND; print "Filename = ", ARGV[ARGIND]
}' junk1 junk2 junk3
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
ARGIND = 1
Filename = junk1
ARGIND = 2
Filename = junk2
ARGIND = 3
Filename = junk3
BINMODE
ใช้เพื่อระบุโหมดไบนารีสำหรับไฟล์ I / O ทั้งหมดบนระบบที่ไม่ใช่ POSIX ค่าตัวเลขเป็น 1, 2 หรือ 3 ระบุว่าไฟล์อินพุตไฟล์เอาต์พุตหรือไฟล์ทั้งหมดตามลำดับควรใช้ไบนารี I / O ค่าสตริงของr หรือ wระบุว่าไฟล์อินพุตหรือไฟล์เอาต์พุตตามลำดับควรใช้ไบนารี I / O ค่าสตริงของrw หรือ wr ระบุว่าไฟล์ทั้งหมดควรใช้ไบนารี I / O
ERRNO
สตริงระบุข้อผิดพลาดเมื่อการเปลี่ยนเส้นทางล้มเหลวสำหรับ getline หรือถ้า close การโทรล้มเหลว
Example
[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
Error: No such file or directory
FIELDWIDTHS
มีการตั้งค่ารายการตัวแปรความกว้างของฟิลด์ที่คั่นด้วยช่องว่าง GAWK จะแยกวิเคราะห์อินพุตเป็นฟิลด์ที่มีความกว้างคงที่แทนที่จะใช้ค่าของตัวแปร FS เป็นตัวคั่นฟิลด์
ไม่รู้
เมื่อตั้งค่าตัวแปรนี้ GAWK จะไม่คำนึงถึงขนาดตัวพิมพ์ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงสิ่งนี้ -
Example
[jerry]$ awk 'BEGIN{IGNORECASE = 1} /amit/' marks.txt
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
1) Amit Physics 80
ผ้าสำลี
ให้การควบคุมแบบไดนามิกของไฟล์ --lintตัวเลือกจากโปรแกรม GAWK เมื่อตั้งค่าตัวแปรนี้ GAWK จะพิมพ์คำเตือนผ้าสำลี เมื่อกำหนดค่าสตริงเป็นอันตรายคำเตือนผ้าสำลีจะกลายเป็นข้อผิดพลาดร้ายแรงเช่นเดียวกัน--lint=fatal.
Example
[jerry]$ awk 'BEGIN {LINT = 1; a}'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
awk: cmd. line:1: warning: reference to uninitialized variable `a'
awk: cmd. line:1: warning: statement has no effect
กระบวนการ
นี่คืออาร์เรย์เชื่อมโยงที่มีข้อมูลเกี่ยวกับกระบวนการเช่นหมายเลข UID จริงและมีประสิทธิภาพหมายเลขรหัสกระบวนการและอื่น ๆ
Example
[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
4316
TEXTDOMAIN
แสดงถึงโดเมนข้อความของโปรแกรม AWK ใช้เพื่อค้นหาคำแปลที่แปลเป็นภาษาท้องถิ่นสำหรับสตริงของโปรแกรม
Example
[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'
ในการเรียกใช้รหัสนี้คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
Output
messages
ผลลัพธ์ด้านบนแสดงข้อความภาษาอังกฤษเนื่องจาก en_IN สถานที่