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 สถานที่