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ữ