AWK - Biến tích hợp

AWK cung cấp một số biến tích hợp sẵn. Chúng đóng một vai trò quan trọng trong khi viết các tập lệnh AWK. Chương này trình bày cách sử dụng các biến dựng sẵn.

Các biến AWK tiêu chuẩn

Các biến AWK tiêu chuẩn được thảo luận bên dưới.

ARGC

Nó ngụ ý số lượng đối số được cung cấp tại dòng lệnh.

Example

[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Arguments = 5

Nhưng tại sao AWK lại hiển thị 5 khi bạn chỉ vượt qua 4 đối số? Chỉ cần kiểm tra ví dụ sau để xóa nghi ngờ của bạn.

ARGV

Nó là một mảng lưu trữ các đối số dòng lệnh. Chỉ số hợp lệ của mảng nằm trong khoảng từ 0 đến 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

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

ARGV[0] = awk
ARGV[1] = one
ARGV[2] = two
ARGV[3] = three

CONVFMT

Nó đại diện cho định dạng chuyển đổi cho các số. Giá trị mặc định của nó là%.6g.

Example

[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Conversion Format = %.6g

ENVIRON

Nó là một mảng kết hợp của các biến môi trường.

Example

[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

jerry

Để tìm tên của các biến môi trường khác, hãy sử dụng env chỉ huy.

FILENAME

Nó đại diện cho tên tệp hiện tại.

Example

[jerry]$ awk 'END {print FILENAME}' marks.txt

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

marks.txt

Xin lưu ý rằng FILENAME không được xác định trong khối BEGIN.

FS

Nó đại diện cho dấu phân tách trường (đầu vào) và giá trị mặc định của nó là khoảng trắng. Bạn cũng có thể thay đổi điều này bằng cách sử dụng-F tùy chọn dòng lệnh.

Example

[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

FS =  $

NF

Nó đại diện cho số lượng trường trong bản ghi hiện tại. Ví dụ: ví dụ sau chỉ in những dòng có nhiều hơn hai trường.

Example

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

One Two Three
One Two Three Four

NR

Nó đại diện cho số lượng bản ghi hiện tại. Ví dụ, ví dụ sau sẽ in bản ghi nếu số bản ghi hiện tại nhỏ hơn ba.

Example

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

One Two
One Two Three

FNR

Nó tương tự như NR, nhưng liên quan đến tệp hiện tại. Nó hữu ích khi AWK đang hoạt động trên nhiều tệp. Giá trị của FNR đặt lại với tệp mới.

OFMT

Nó đại diện cho số định dạng đầu ra và giá trị mặc định của nó là %.6g.

Example

[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

OFMT = %.6g

OFS

Nó đại diện cho dấu phân cách trường đầu ra và giá trị mặc định của nó là khoảng trắng.

Example

[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

OFS =  $

ORS

Nó đại diện cho dấu phân tách bản ghi đầu ra và giá trị mặc định của nó là dòng mới.

Example

[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

Output

ORS = $
$

RLENGTH

Nó đại diện cho độ dài của chuỗi được so khớp bởi matchchức năng. Hàm đối sánh của AWK tìm kiếm một chuỗi nhất định trong chuỗi đầu vào.

Example

[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

2

RS

Nó đại diện cho (đầu vào) dấu phân tách bản ghi và giá trị mặc định của nó là dòng mới.

Example

[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

RS = $
$

RSTART

Nó đại diện cho vị trí đầu tiên trong chuỗi được so khớp bởi match chức năng.

Example

[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

9

SUBSEP

Nó đại diện cho ký tự phân tách cho các chỉ số con của mảng và giá trị mặc định của nó là \034.

Example

[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

SUBSEP = ^\$

$ 0

Nó đại diện cho toàn bộ bản ghi đầu vào.

Example

[jerry]$ awk '{print $0}' marks.txt

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

1) Amit     Physics   80
2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

$ n

Nó đại diện cho trường thứ n trong bản ghi hiện tại nơi các trường được phân tách bằng FS.

Example

[jerry]$ awk '{print $3 "\t" $4}' marks.txt

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Physics   80
Maths     90
Biology   87
English   85
History   89

Các biến cụ thể của GNU AWK

Các biến cụ thể của GNU AWK như sau:

ARGIND

Nó đại diện cho chỉ mục trong ARGV của tệp hiện tại đang được xử lý.

Example

[jerry]$ awk '{ 
   print "ARGIND   = ", ARGIND; print "Filename = ", ARGV[ARGIND] 
}' junk1 junk2 junk3

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

ARGIND   =  1
Filename =  junk1
ARGIND   =  2
Filename =  junk2
ARGIND   =  3
Filename =  junk3

BINMODE

Nó được sử dụng để chỉ định chế độ nhị phân cho tất cả I / O tệp trên hệ thống không phải POSIX. Các giá trị số 1, 2 hoặc 3 chỉ định rằng các tệp đầu vào, tệp đầu ra hoặc tất cả các tệp tương ứng phải sử dụng I / O nhị phân. Giá trị chuỗi củar hoặc là wchỉ định rằng các tệp đầu vào hoặc tệp đầu ra tương ứng nên sử dụng I / O nhị phân. Giá trị chuỗi củarw hoặc là wr chỉ định rằng tất cả các tệp phải sử dụng I / O nhị phân.

ERRNO

Một chuỗi chỉ ra lỗi khi chuyển hướng không thành công cho getline hoặc nếu close cuộc gọi không thành công.

Example

[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Error: No such file or directory

FIELDWIDTHS

Một danh sách biến độ rộng trường được phân tách bằng dấu cách được đặt, GAWK phân tích cú pháp đầu vào thành các trường có độ rộng cố định, thay vì sử dụng giá trị của biến FS làm dấu phân tách trường.

BỎ QUA TRƯỜNG HỢP

Khi biến này được đặt, GAWK trở nên không phân biệt chữ hoa chữ thường. Ví dụ sau đây chứng minh điều này -

Example

[jerry]$ awk 'BEGIN{IGNORECASE = 1} /amit/' marks.txt

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

1) Amit  Physics   80

LINT

Nó cung cấp khả năng kiểm soát động của --linttùy chọn từ chương trình GAWK. Khi biến này được đặt, GAWK sẽ in cảnh báo xơ vải. Khi được gán giá trị chuỗi nghiêm trọng, cảnh báo lint sẽ trở thành lỗi nghiêm trọng, giống như--lint=fatal.

Example

[jerry]$ awk 'BEGIN {LINT = 1; a}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

awk: cmd. line:1: warning: reference to uninitialized variable `a'
awk: cmd. line:1: warning: statement has no effect

PROCINFO

Đây là một mảng kết hợp chứa thông tin về quy trình, chẳng hạn như số UID thực và hiệu quả, số ID quy trình, v.v.

Example

[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

4316

TEXTDOMAIN

Nó đại diện cho miền văn bản của chương trình AWK. Nó được sử dụng để tìm các bản dịch được bản địa hóa cho các chuỗi của chương trình.

Example

[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

messages

Kết quả đầu ra ở trên hiển thị văn bản tiếng Anh do en_IN ngôn ngữ