AWK - Hướng dẫn nhanh
AWK là một ngôn ngữ lập trình thông dịch. Nó rất mạnh mẽ và được thiết kế đặc biệt để xử lý văn bản. Tên của nó có nguồn gốc từ họ của các tác giả của nó -Alfred Aho, Peter Weinberger, and Brian Kernighan.
Phiên bản AWK mà GNU / Linux phân phối được viết và duy trì bởi Tổ chức Phần mềm Tự do (FSF); nó thường được gọi làGNU AWK.
Các loại AWK
Sau đây là các biến thể của AWK:
AWK - AWK gốc từ Phòng thí nghiệm AT&T.
NAWK - Phiên bản AWK mới hơn và cải tiến từ Phòng thí nghiệm AT&T.
GAWK- Đó là GNU AWK. Tất cả các bản phân phối GNU / Linux đều vận chuyển GAWK. Nó hoàn toàn tương thích với AWK và NAWK.
Sử dụng điển hình của AWK
Có thể thực hiện vô số tác vụ với AWK. Danh sách dưới đây chỉ là một vài trong số họ -
- Xử lý văn bản,
- Tạo báo cáo văn bản được định dạng,
- Thực hiện các phép toán số học,
- Thực hiện các hoạt động chuỗi và nhiều hơn nữa.
Chương này mô tả cách thiết lập môi trường AWK trên hệ thống GNU / Linux của bạn.
Cài đặt bằng Trình quản lý gói
Nói chung, AWK có sẵn theo mặc định trên hầu hết các bản phân phối GNU / Linux. Bạn có thể dùngwhichđể kiểm tra xem nó có trên hệ thống của bạn hay không. Trong trường hợp bạn không có AWK, hãy cài đặt nó trên GNU / Linux dựa trên Debian bằng Công cụ gói nâng cao(APT) quản lý gói như sau -
[jeryy]$ sudo apt-get update [jeryy]$ sudo apt-get install gawk
Tương tự, để cài đặt AWK trên GNU / Linux dựa trên RPM, hãy sử dụng Yellowdog Updator Modifier yum quản lý gói như sau -
[root]# yum install gawk
Sau khi cài đặt, hãy đảm bảo rằng AWK có thể truy cập được qua dòng lệnh.
[jerry]$ which awk
Khi thực hiện đoạn mã trên, bạn nhận được kết quả sau:
/usr/bin/awk
Cài đặt từ mã nguồn
Vì GNU AWK là một phần của dự án GNU, nên mã nguồn của nó có sẵn để tải xuống miễn phí. Chúng ta đã biết cách cài đặt AWK bằng trình quản lý gói. Bây giờ chúng ta hãy hiểu cách cài đặt AWK từ mã nguồn của nó.
Cài đặt sau có thể áp dụng cho bất kỳ phần mềm GNU / Linux nào và cho hầu hết các chương trình miễn phí có sẵn khác. Đây là các bước cài đặt -
Step 1- Tải xuống mã nguồn từ một nơi xác thực. Tiện ích dòng lệnhwget phục vụ mục đích này.
[jerry]$ wget http://ftp.gnu.org/gnu/gawk/gawk-4.1.1.tar.xz
Step 2 - Giải nén và giải nén mã nguồn đã tải xuống.
[jerry]$ tar xvf gawk-4.1.1.tar.xz
Step 3 - Thay đổi vào thư mục và chạy cấu hình.
[jerry]$ ./configure
Step 4 - Sau khi hoàn thành thành công, configuretạo Makefile. Để biên dịch mã nguồn, hãy phát hànhmake chỉ huy.
[jerry]$ make
Step 5- Bạn có thể chạy bộ thử nghiệm để đảm bảo bản dựng sạch sẽ. Đây là một bước tùy chọn.
[jerry]$ make check
Step 6- Cuối cùng, cài đặt AWK. Đảm bảo rằng bạn có đặc quyền của người dùng siêu cấp.
[jerry]$ sudo make install
Đó là nó! Bạn đã biên dịch và cài đặt thành công AWK. Xác minh nó bằng cách thực hiệnawk lệnh như sau:
[jerry]$ which awk
Khi thực thi mã này, bạn nhận được kết quả sau:
/usr/bin/awk
Để trở thành một lập trình viên AWK chuyên nghiệp, bạn cần biết nội hàm của nó. AWK tuân theo một quy trình làm việc đơn giản - Đọc, Thực thi và Lặp lại. Sơ đồ sau mô tả quy trình làm việc của AWK:
Đọc
AWK đọc một dòng từ luồng đầu vào (tệp, đường dẫn hoặc stdin) và lưu trữ trong bộ nhớ.
Hành hình
Tất cả các lệnh AWK được áp dụng tuần tự trên đầu vào. Theo mặc định, AWK thực hiện các lệnh trên mọi dòng. Chúng tôi có thể hạn chế điều này bằng cách cung cấp các mẫu.
Nói lại
Quá trình này lặp lại cho đến khi tệp kết thúc.
Cấu trúc chương trình
Bây giờ chúng ta hãy hiểu cấu trúc chương trình của AWK.
BEGIN khối
Cú pháp của khối BEGIN như sau:
Syntax
BEGIN {awk-commands}
Khối BEGIN được thực thi khi khởi động chương trình. Nó chỉ thực thi một lần. Đây là nơi tốt để khởi tạo các biến. BEGIN là một từ khóa AWK và do đó nó phải ở dạng chữ hoa. Xin lưu ý rằng khối này là tùy chọn.
Khối cơ thể
Cú pháp của khối nội dung như sau:
Syntax
/pattern/ {awk-commands}
Khối nội dung áp dụng các lệnh AWK trên mọi dòng đầu vào. Theo mặc định, AWK thực thi các lệnh trên mọi dòng. Chúng tôi có thể hạn chế điều này bằng cách cung cấp các mẫu. Lưu ý rằng không có từ khóa nào cho khối Body.
KẾT THÚC Khối
Cú pháp của khối END như sau:
Syntax
END {awk-commands}
Khối END thực thi ở cuối chương trình. END là một từ khóa AWK và do đó nó phải ở dạng chữ hoa. Xin lưu ý rằng khối này là tùy chọn.
Hãy để chúng tôi tạo một tệp marks.txt trong đó có số thứ tự, tên học sinh, tên môn học và số điểm đạt được.
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
Bây giờ, hãy để chúng tôi hiển thị nội dung tệp có tiêu đề bằng cách sử dụng tập lệnh AWK.
Example
[jerry]$ awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}' marks.txt
Khi mã này được thực thi, nó tạo ra kết quả sau:
Output
Sr No Name Sub Marks
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
Khi bắt đầu, AWK in tiêu đề từ khối BEGIN. Sau đó, trong khối nội dung, nó đọc một dòng từ tệp và thực hiện lệnh in của AWK, lệnh này chỉ in nội dung trên luồng đầu ra tiêu chuẩn. Quá trình này lặp lại cho đến khi tệp kết thúc.
AWK rất dễ sử dụng. Chúng tôi có thể cung cấp các lệnh AWK trực tiếp từ dòng lệnh hoặc dưới dạng tệp văn bản chứa các lệnh AWK.
Dòng lệnh AWK
Chúng ta có thể chỉ định một lệnh AWK trong các dấu ngoặc kép tại dòng lệnh như được hiển thị:
awk [options] file ...
Thí dụ
Xem xét một tệp văn bản marks.txt với nội dung sau -
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
Hãy để chúng tôi hiển thị toàn bộ nội dung của tệp bằng AWK như sau:
Example
[jerry]$ awk '{print}' 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
Tệp chương trình AWK
Chúng tôi có thể cung cấp các lệnh AWK trong một tệp kịch bản như minh họa -
awk [options] -f file ....
Đầu tiên, tạo một tệp văn bản command.awk chứa lệnh AWK như hình dưới đây -
{print}
Bây giờ chúng ta có thể hướng dẫn AWK đọc các lệnh từ tệp văn bản và thực hiện hành động. Ở đây, chúng ta đạt được kết quả tương tự như trong ví dụ trên.
Example
[jerry]$ awk -f command.awk 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
Tùy chọn tiêu chuẩn AWK
AWK hỗ trợ các tùy chọn tiêu chuẩn sau đây có thể được cung cấp từ dòng lệnh.
Tùy chọn -v
Tùy chọn này chỉ định một giá trị cho một biến. Nó cho phép gán trước khi thực hiện chương trình. Ví dụ sau đây mô tả cách sử dụng tùy chọn -v.
Example
[jerry]$ awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Name = Jerry
Tùy chọn --dump-variable [= file]
Nó in ra danh sách các biến toàn cục đã được sắp xếp và giá trị cuối cùng của chúng vào tệp. Tệp mặc định làawkvars.out.
Example
[jerry]$ awk --dump-variables '' [jerry]$ cat awkvars.out
Khi thực hiện đoạn mã trên, bạn nhận được kết quả sau:
Output
ARGC: 1
ARGIND: 0
ARGV: array, 1 elements
BINMODE: 0
CONVFMT: "%.6g"
ERRNO: ""
FIELDWIDTHS: ""
FILENAME: ""
FNR: 0
FPAT: "[^[:space:]]+"
FS: " "
IGNORECASE: 0
LINT: 0
NF: 0
NR: 0
OFMT: "%.6g"
OFS: " "
ORS: "\n"
RLENGTH: 0
RS: "\n"
RSTART: 0
RT: ""
SUBSEP: "\034"
TEXTDOMAIN: "messages"
Tùy chọn --help
Tùy chọn này in thông báo trợ giúp trên đầu ra chuẩn.
Example
[jerry]$ awk --help
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options : GNU long options: (standard)
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
Short options : GNU long options: (extensions)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[file] --dump-variables[=file]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-L [fatal] --lint[=fatal]
-n --non-decimal-data
-N --use-lc-numeric
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-S --sandbox
-t --lint-old
-V --version
Tùy chọn --lint [= Fat]
Tùy chọn này cho phép kiểm tra các cấu trúc không di động hoặc không rõ ràng. Khi một cuộc tranh cãifatalđược cung cấp, nó coi các thông báo cảnh báo là lỗi. Ví dụ sau đây chứng minh điều này -
Example
[jerry]$ awk --lint '' /bin/ls
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
awk: cmd. line:1: warning: empty program text on command line
awk: cmd. line:1: warning: source file does not end in newline
awk: warning: no program text at all!
Tùy chọn --posix
Tùy chọn này bật khả năng tương thích POSIX nghiêm ngặt, trong đó tất cả các tiện ích mở rộng phổ biến và tiện ích mở rộng dành riêng cho gawk đều bị tắt.
Tùy chọn --profile [= file]
Tùy chọn này tạo ra một phiên bản chương trình được in đẹp trong tệp. Tệp mặc định làawkprof.out. Ví dụ đơn giản dưới đây minh họa điều này -
Example
[jerry]$ awk --profile 'BEGIN{printf"---|Header|--\n"} {print} END{printf"---|Footer|---\n"}' marks.txt > /dev/null [jerry]$ cat awkprof.out
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
# gawk profile, created Sun Oct 26 19:50:48 2014
# BEGIN block(s)
BEGIN {
printf "---|Header|--\n"
}
# Rule(s) {
print $0
}
# END block(s)
END {
printf "---|Footer|---\n"
}
Tùy chọn --traditional
Tùy chọn này vô hiệu hóa tất cả các tiện ích mở rộng dành riêng cho gawk.
Tùy chọn --version
Tùy chọn này hiển thị thông tin phiên bản của chương trình AWK.
Example
[jerry]$ awk --version
Khi mã này được thực thi, nó tạo ra kết quả sau:
Output
GNU Awk 4.0.1
Copyright (C) 1989, 1991-2012 Free Software Foundation.
Chương này mô tả một số lệnh AWK hữu ích và các ví dụ thích hợp của chúng. Xem xét một tệp văn bảnmarks.txt sẽ được xử lý với nội dung sau:
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
In cột hoặc trường
Bạn có thể hướng dẫn AWK chỉ in các cột nhất định từ trường nhập liệu. Ví dụ sau đây chứng minh điều này -
Thí dụ
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Physics 80
Maths 90
Biology 87
English 85
History 89
Trong tập tin marks.txt, cột thứ ba chứa tên môn học và cột thứ tư chứa các điểm đạt được trong một môn học cụ thể. Hãy để chúng tôi in hai cột này bằng lệnh in AWK. Trong ví dụ trên,$3 and $4 đại diện cho các trường thứ ba và thứ tư tương ứng từ bản ghi đầu vào.
In tất cả các dòng
Theo mặc định, AWK in tất cả các dòng phù hợp với mẫu.
Thí dụ
[jerry]$ awk '/a/ {print $0}' marks.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
Trong ví dụ trên, chúng tôi đang tìm kiếm mẫu biểu mẫu a. Khi khớp mẫu thành công, nó sẽ thực thi một lệnh từ khối nội dung. Trong trường hợp không có khối nội dung - hành động mặc định được thực hiện là in bản ghi. Do đó, lệnh sau tạo ra cùng một kết quả:
Thí dụ
[jerry]$ awk '/a/' marks.txt
In các cột theo mẫu
Khi khớp mẫu thành công, AWK in toàn bộ bản ghi theo mặc định. Nhưng bạn có thể hướng dẫn AWK chỉ in một số trường nhất định. Ví dụ: ví dụ sau sẽ in trường thứ ba và thứ tư khi đối sánh mẫu thành công.
Thí dụ
[jerry]$ awk '/a/ {print $3 "\t" $4}' marks.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Maths 90
Biology 87
English 85
History 89
In cột theo thứ tự bất kỳ
Bạn có thể in các cột theo bất kỳ thứ tự nào. Ví dụ, ví dụ sau sẽ in cột thứ tư theo sau là cột thứ ba.
Thí dụ
[jerry]$ awk '/a/ {print $4 "\t" $3}' marks.txt
Khi thực hiện đoạn mã trên, bạn nhận được kết quả sau:
Đầu ra
90 Maths
87 Biology
85 English
89 History
Đếm và in mẫu phù hợp
Hãy để chúng tôi xem một ví dụ trong đó bạn có thể đếm và in số dòng mà đối sánh mẫu đã thành công.
Thí dụ
[jerry]$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Count = 4
Trong ví dụ này, chúng tôi tăng giá trị của bộ đếm khi khớp mẫu thành công và chúng tôi in giá trị này trong khối END. Lưu ý rằng không giống như các ngôn ngữ lập trình khác, không cần phải khai báo một biến trước khi sử dụng nó.
In các dòng với hơn 18 ký tự
Hãy để chúng tôi chỉ in những dòng có hơn 18 ký tự.
Thí dụ
[jerry]$ awk 'length($0) > 18' marks.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
3) Shyam Biology 87
4) Kedar English 85
AWK cung cấp một length hàm trả về độ dài của chuỗi. $0biến lưu trữ toàn bộ dòng và trong trường hợp không có khối nội dung, hành động mặc định được thực hiện, tức là hành động in. Do đó, nếu một dòng có nhiều hơn 18 ký tự, thì kết quả so sánh là true và dòng được in.
AWK cung cấp một số biến tích hợp. 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 các đố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 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 tá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 hiện đ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 phải 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 các 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ữ
Giống như các ngôn ngữ lập trình khác, AWK cũng cung cấp một tập hợp lớn các toán tử. Chương này giải thích các toán tử AWK với các ví dụ phù hợp.
Không. | Nhà khai thác & Mô tả |
---|---|
1 | Toán tử số học AWK hỗ trợ các toán tử số học sau. |
2 | Các toán tử tăng và giảm AWK hỗ trợ các toán tử tăng và giảm sau. |
3 | Người điều hành nhiệm vụ AWK hỗ trợ các toán tử gán sau. |
4 | Toán tử quan hệ AWK hỗ trợ các toán tử quan hệ sau. |
5 | Toán tử logic AWK hỗ trợ các toán tử logic sau. |
6 | Nhà khai thác bậc ba Chúng ta có thể dễ dàng thực hiện một biểu thức điều kiện bằng cách sử dụng toán tử bậc ba. |
7 | Các nhà khai thác đơn lẻ AWK hỗ trợ các toán tử một ngôi sau. |
số 8 | Toán tử lũy thừa Có hai định dạng của toán tử hàm mũ. |
9 | Toán tử nối chuỗi Dấu cách là một toán tử nối chuỗi hợp nhất hai chuỗi. |
10 | Nhà điều hành tư cách thành viên mảng Nó được đại diện bởi in. Nó được sử dụng trong khi truy cập các phần tử mảng. |
11 | Toán tử biểu thức chính quy Ví dụ này giải thích hai dạng toán tử biểu thức chính quy. |
AWK rất mạnh mẽ và hiệu quả trong việc xử lý các biểu thức chính quy. Một số tác vụ phức tạp có thể được giải quyết bằng các biểu thức chính quy đơn giản. Bất kỳ chuyên gia dòng lệnh nào cũng biết sức mạnh của các biểu thức chính quy.
Chương này bao gồm các biểu thức chính quy tiêu chuẩn với các ví dụ phù hợp.
Chấm
Nó khớp với bất kỳ ký tự đơn nào ngoại trừ ký tự cuối dòng. Ví dụ, ví dụ sau phù hợp vớifin, fun, fan Vân vân.
Thí dụ
[jerry]$ echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'
Khi thực hiện đoạn mã trên, bạn nhận được kết quả sau:
Đầu ra
fun
fin
fan
Đầu dòng
Nó phù hợp với đầu dòng. Ví dụ: ví dụ sau sẽ in tất cả các dòng bắt đầu bằng mẫuThe.
Thí dụ
[jerry]$ echo -e "This\nThat\nThere\nTheir\nthese" | awk '/^The/'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
There
Their
Kết thúc dòng
Nó phù hợp với cuối dòng. Ví dụ: ví dụ sau in ra các dòng kết thúc bằng chữ cáin.
Thí dụ
[jerry]$ echo -e "knife\nknow\nfun\nfin\nfan\nnine" | awk '/n$/'
Đầu ra
Khi thực thi mã này, bạn nhận được kết quả sau:
fun
fin
fan
Khớp bộ ký tự
Nó chỉ được sử dụng để khớp một trong số một số ký tự. Ví dụ: ví dụ sau phù hợp với mẫuCall và Tall nhưng không Ball.
Thí dụ
[jerry]$ echo -e "Call\nTall\nBall" | awk '/[CT]all/'
Đầu ra
Khi thực thi mã này, bạn nhận được kết quả sau:
Call
Tall
Bộ độc quyền
Trong tập hợp độc quyền, carat phủ định tập hợp các ký tự trong dấu ngoặc vuông. Ví dụ: ví dụ sau chỉ inBall.
Thí dụ
[jerry]$ echo -e "Call\nTall\nBall" | awk '/[^CT]all/'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Ball
Thay đổi
Một thanh dọc cho phép các biểu thức chính quy được ORed một cách hợp lý. Ví dụ, ví dụ sau inBall và Call.
Thí dụ
[jerry]$ echo -e "Call\nTall\nBall\nSmall\nShall" | awk '/Call|Ball/'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Call
Ball
Không hoặc Một lần xuất hiện
Nó khớp với không hoặc một lần xuất hiện của ký tự trước đó. Ví dụ, ví dụ sau phù hợp vớiColour cũng như Color. Chúng tôi đã làmu như một ký tự tùy chọn bằng cách sử dụng ?.
Thí dụ
[jerry]$ echo -e "Colour\nColor" | awk '/Colou?r/'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Colour
Color
Không có hoặc nhiều lần xuất hiện
Nó khớp với không hoặc nhiều lần xuất hiện của ký tự trước đó. Ví dụ, ví dụ sau phù hợp vớica, cat, catt, và như thế.
Thí dụ
[jerry]$ echo -e "ca\ncat\ncatt" | awk '/cat*/'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
ca
cat
catt
Một hoặc nhiều lần xuất hiện
Nó khớp với một hoặc nhiều lần xuất hiện của ký tự trước đó. Ví dụ: ví dụ dưới đây khớp với một hoặc nhiều lần xuất hiện của2.
Thí dụ
[jerry]$ echo -e "111\n22\n123\n234\n456\n222" | awk '/2+/'
Khi thực hiện đoạn mã trên, bạn nhận được kết quả sau:
Đầu ra
22
123
234
222
Phân nhóm
Parentheses ()được sử dụng để nhóm và ký tự | được sử dụng cho các lựa chọn thay thế. Ví dụ: biểu thức chính quy sau đây khớp với các dòng chứaApple Juice or Apple Cake.
Thí dụ
[jerry]$ echo -e "Apple Juice\nApple Pie\nApple Tart\nApple Cake" | awk
'/Apple (Juice|Cake)/'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Apple Juice
Apple Cake
AWK có các mảng liên kết và một trong những điều tốt nhất về nó là - các chỉ mục không cần phải là tập hợp số liên tục; bạn có thể sử dụng chuỗi hoặc số làm chỉ số mảng. Ngoài ra, không cần khai báo trước kích thước của mảng - mảng có thể mở rộng / thu nhỏ trong thời gian chạy.
Cú pháp của nó như sau:
Cú pháp
array_name[index] = value
Ở đâu array_name là tên của mảng, index là chỉ số mảng và value là bất kỳ giá trị nào được gán cho phần tử của mảng.
Tạo mảng
Để hiểu rõ hơn về mảng, chúng ta hãy tạo và truy cập các phần tử của mảng.
Thí dụ
[jerry]$ awk 'BEGIN {
fruits["mango"] = "yellow";
fruits["orange"] = "orange"
print fruits["orange"] "\n" fruits["mango"]
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
orange
yellow
Trong ví dụ trên, chúng ta khai báo mảng là fruitscó chỉ số là tên quả và giá trị là màu của quả. Để truy cập các phần tử mảng, chúng tôi sử dụngarray_name[index] định dạng.
Xóa các phần tử mảng
Để chèn, chúng tôi đã sử dụng toán tử gán. Tương tự, chúng ta có thể sử dụngdeleteđể xóa một phần tử khỏi mảng. Cú pháp của câu lệnh xóa như sau:
Cú pháp
delete array_name[index]
Ví dụ sau đây xóa phần tử orange. Do đó lệnh không hiển thị bất kỳ đầu ra nào.
Thí dụ
[jerry]$ awk 'BEGIN {
fruits["mango"] = "yellow";
fruits["orange"] = "orange";
delete fruits["orange"];
print fruits["orange"]
}'
Mảng đa chiều
AWK chỉ hỗ trợ mảng một chiều. Nhưng bạn có thể dễ dàng mô phỏng một mảng nhiều chiều bằng chính mảng một chiều.
Ví dụ, dưới đây là một mảng hai chiều 3x3 -
100 200 300
400 500 600
700 800 900
Trong ví dụ trên, mảng [0] [0] lưu trữ 100, mảng [0] [1] lưu trữ 200, v.v. Để lưu trữ 100 tại vị trí mảng [0] [0], chúng ta có thể sử dụng cú pháp sau:
Cú pháp
array["0,0"] = 100
Mặc dù chúng tôi đã cho 0,0dưới dạng chỉ mục, đây không phải là hai chỉ mục. Trong thực tế, nó chỉ là một chỉ mục với chuỗi0,0.
Ví dụ sau mô phỏng một mảng 2-D:
Thí dụ
[jerry]$ awk 'BEGIN {
array["0,0"] = 100;
array["0,1"] = 200;
array["0,2"] = 300;
array["1,0"] = 400;
array["1,1"] = 500;
array["1,2"] = 600;
# print array elements
print "array[0,0] = " array["0,0"];
print "array[0,1] = " array["0,1"];
print "array[0,2] = " array["0,2"];
print "array[1,0] = " array["1,0"];
print "array[1,1] = " array["1,1"];
print "array[1,2] = " array["1,2"];
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
array[0,0] = 100
array[0,1] = 200
array[0,2] = 300
array[1,0] = 400
array[1,1] = 500
array[1,2] = 600
Bạn cũng có thể thực hiện nhiều thao tác trên một mảng, chẳng hạn như sắp xếp các phần tử / chỉ mục của nó. Với mục đích đó, bạn có thể sử dụngassort và asorti chức năng
Giống như các ngôn ngữ lập trình khác, AWK cung cấp các câu lệnh điều kiện để kiểm soát luồng của một chương trình. Chương này giải thích các câu lệnh kiểm soát của AWK với các ví dụ phù hợp.
Câu lệnh if
Nó chỉ đơn giản là kiểm tra tình trạng và thực hiện các hành động nhất định tùy thuộc vào tình trạng bệnh. Dưới đây là cú pháp củaif tuyên bố -
Cú pháp
if (condition)
action
Chúng ta cũng có thể sử dụng một cặp dấu ngoặc nhọn như dưới đây để thực hiện nhiều hành động -
Cú pháp
if (condition) {
action-1
action-1
.
.
action-n
}
Ví dụ: ví dụ sau kiểm tra xem một số có phải là số chẵn hay không -
Thí dụ
[jerry]$ awk 'BEGIN {num = 10; if (num % 2 == 0) printf "%d is even number.\n", num }'
Khi thực hiện đoạn mã trên, bạn nhận được kết quả sau:
Đầu ra
10 is even number.
Nếu tuyên bố khác
Trong if-else cú pháp, chúng tôi có thể cung cấp danh sách các hành động được thực hiện khi một điều kiện trở thành sai.
Cú pháp của if-else tuyên bố như sau:
Cú pháp
if (condition)
action-1
else
action-2
Trong cú pháp trên, hành động-1 được thực hiện khi điều kiện đánh giá là true và hành động-2 được thực hiện khi điều kiện đánh giá là sai. Ví dụ: ví dụ sau kiểm tra xem một số có phải là số chẵn hay không -
Thí dụ
[jerry]$ awk 'BEGIN {
num = 11; if (num % 2 == 0) printf "%d is even number.\n", num;
else printf "%d is odd number.\n", num
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
11 is odd number.
Thang If-Else-If
Chúng tôi có thể dễ dàng tạo một if-else-if bậc thang bằng cách sử dụng nhiều if-elsecác câu lệnh. Ví dụ sau đây chứng minh điều này -
Thí dụ
[jerry]$ awk 'BEGIN {
a = 30;
if (a==10)
print "a = 10";
else if (a == 20)
print "a = 20";
else if (a == 30)
print "a = 30";
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
a = 30
Chương này giải thích các vòng lặp của AWK với ví dụ phù hợp. Vòng lặp được sử dụng để thực hiện một tập hợp các hành động theo cách lặp lại. Việc thực hiện vòng lặp tiếp tục miễn là điều kiện của vòng lặp là đúng.
Đối với vòng lặp
Cú pháp của for vòng lặp là -
Cú pháp
for (initialization; condition; increment/decrement)
action
Ban đầu, forcâu lệnh thực hiện hành động khởi tạo, sau đó nó kiểm tra điều kiện. Nếu điều kiện là đúng, nó thực hiện các hành động, sau đó nó thực hiện hoạt động tăng hoặc giảm. Việc thực hiện vòng lặp tiếp tục miễn là điều kiện đúng. Ví dụ: ví dụ sau in từ 1 đến 5 bằng cách sử dụngfor vòng lặp -
Thí dụ
[jerry]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
1
2
3
4
5
Trong khi lặp lại
Các whilevòng lặp tiếp tục thực hiện hành động cho đến khi một điều kiện logic cụ thể được đánh giá là true. Đây là cú pháp củawhile vòng lặp -
Cú pháp
while (condition)
action
AWK đầu tiên kiểm tra điều kiện; nếu điều kiện là đúng, nó sẽ thực hiện hành động. Quá trình này lặp lại miễn là điều kiện vòng lặp đánh giá là true. Ví dụ: ví dụ sau in từ 1 đến 5 bằng cách sử dụngwhile vòng lặp -
Thí dụ
[jerry]$ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
1
2
3
4
5
Vòng lặp Do-While
Các do-whilevòng lặp tương tự như vòng lặp while, ngoại trừ điều kiện kiểm tra được đánh giá ở cuối vòng lặp. Đây là cú pháp củado-whilevòng lặp -
Cú pháp
do
action
while (condition)
Trong một do-whilevòng lặp, câu lệnh hành động được thực thi ít nhất một lần ngay cả khi câu lệnh điều kiện đánh giá sai. Ví dụ: ví dụ sau in từ 1 đến 5 số bằng cách sử dụngdo-while vòng lặp -
Thí dụ
[jerry]$ awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
1
2
3
4
5
Tuyên bố ngắt
Đúng như tên gọi, nó được dùng để kết thúc quá trình thực thi vòng lặp. Đây là một ví dụ kết thúc vòng lặp khi tổng lớn hơn 50.
Thí dụ
[jerry]$ awk 'BEGIN {
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) break; else print "Sum =", sum
}
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45
Tiếp tục Tuyên bố
Các continuecâu lệnh được sử dụng bên trong vòng lặp để chuyển sang lần lặp tiếp theo của vòng lặp. Nó rất hữu ích khi bạn muốn bỏ qua quá trình xử lý một số dữ liệu bên trong vòng lặp. Ví dụ: ví dụ sau sử dụngcontinue để in các số chẵn từ 1 đến 20.
Thí dụ
[jerry]$ awk 'BEGIN {
for (i = 1; i <= 20; ++i) {
if (i % 2 == 0) print i ; else continue
}
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
2
4
6
8
10
12
14
16
18
20
Tuyên bố thoát
Nó được sử dụng để dừng việc thực thi tập lệnh. Nó chấp nhận một số nguyên làm đối số là mã trạng thái thoát cho quy trình AWK. Nếu không có đối số nào được cung cấp,exittrả về trạng thái không. Đây là một ví dụ dừng thực thi khi tổng lớn hơn 50.
Thí dụ
[jerry]$ awk 'BEGIN {
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) exit(10); else print "Sum =", sum
}
}'
Đầu ra
Khi thực thi mã này, bạn nhận được kết quả sau:
Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45
Hãy để chúng tôi kiểm tra trạng thái trả về của tập lệnh.
Thí dụ
[jerry]$ echo $?
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
10
AWK có một số chức năng được tích hợp sẵn trong đó luôn có sẵn cho lập trình viên. Chương này mô tả các thao tác Số học, Chuỗi, Thời gian, Bit và các hàm linh tinh khác với các ví dụ phù hợp.
Không. | Chức năng & Mô tả tích hợp |
---|---|
1 | Các hàm số học AWK có các hàm số học tích hợp sau. |
2 | Hàm chuỗi AWK có các chức năng Chuỗi tích hợp sau. |
3 | Chức năng thời gian AWK có các chức năng thời gian tích hợp sau. |
4 | Chức năng thao tác bit AWK có các chức năng thao tác bit tích hợp sau. |
5 | Các chức năng khác AWK có các chức năng linh tinh sau. |
Chức năng là khối xây dựng cơ bản của một chương trình. AWK cho phép chúng tôi xác định các chức năng của riêng mình. Một chương trình lớn có thể được chia thành các chức năng và mỗi chức năng có thể được viết / kiểm tra độc lập. Nó cung cấp khả năng tái sử dụng của mã.
Dưới đây là định dạng chung của một hàm do người dùng xác định -
Cú pháp
function function_name(argument1, argument2, ...) {
function body
}
Trong cú pháp này, function_namelà tên của hàm do người dùng định nghĩa. Tên hàm phải bắt đầu bằng một chữ cái và các ký tự còn lại có thể là bất kỳ sự kết hợp nào của số, ký tự chữ cái hoặc dấu gạch dưới. Các từ dự trữ của AWK không được dùng làm tên hàm.
Các hàm có thể chấp nhận nhiều đối số được phân tách bằng dấu phẩy. Lập luận là không bắt buộc. Bạn cũng có thể tạo một hàm do người dùng xác định mà không cần bất kỳ đối số nào.
function body bao gồm một hoặc nhiều câu lệnh AWK.
Chúng ta hãy viết hai hàm tính số nhỏ nhất và số lớn nhất và gọi các hàm này từ một hàm khác được gọi là main. Cácfunctions.awk tệp chứa -
Thí dụ
# Returns minimum number
function find_min(num1, num2){
if (num1 < num2)
return num1
return num2
}
# Returns maximum number
function find_max(num1, num2){
if (num1 > num2)
return num1
return num2
}
# Main function
function main(num1, num2){
# Find minimum number
result = find_min(10, 20)
print "Minimum =", result
# Find maximum number
result = find_max(10, 20)
print "Maximum =", result
}
# Script execution starts here
BEGIN {
main(10, 20)
}
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Minimum = 10
Maximum = 20
Cho đến nay, chúng tôi đã hiển thị dữ liệu trên luồng đầu ra tiêu chuẩn. Chúng tôi cũng có thể chuyển hướng dữ liệu đến một tệp. Chuyển hướng xuất hiện sauprint hoặc là printftuyên bố. Chuyển hướng trong AWK được viết giống như chuyển hướng trong các lệnh shell, ngoại trừ việc chúng được viết bên trong chương trình AWK. Chương này giải thích chuyển hướng với các ví dụ phù hợp.
Nhà điều hành chuyển hướng
Cú pháp của toán tử chuyển hướng là:
Cú pháp
print DATA > output-file
Nó ghi dữ liệu vào output-file. Nếu tệp đầu ra không tồn tại, thì nó sẽ tạo một tệp. Khi loại chuyển hướng này được sử dụng, tệp đầu ra sẽ bị xóa trước khi đầu ra đầu tiên được ghi vào nó. Các thao tác ghi tiếp theo vào cùng một tệp đầu ra không xóa tệp đầu ra, nhưng nối thêm vào đó. Ví dụ, ví dụ sau viếtHello, World !!! vào tệp.
Hãy để chúng tôi tạo một tệp với một số dữ liệu văn bản.
Thí dụ
[jerry]$ echo "Old data" > /tmp/message.txt [jerry]$ cat /tmp/message.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Old data
Bây giờ chúng ta hãy chuyển hướng một số nội dung vào nó bằng cách sử dụng toán tử chuyển hướng của AWK.
Thí dụ
[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }' [jerry]$ cat /tmp/message.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Hello, World !!!
Người điều hành nối
Cú pháp của toán tử append như sau:
Cú pháp
print DATA >> output-file
Nó gắn dữ liệu vào output-file. Nếu tệp đầu ra không tồn tại, thì nó sẽ tạo một tệp. Khi loại chuyển hướng này được sử dụng, nội dung mới sẽ được nối vào cuối tệp. Ví dụ: ví dụ sau đây thêm vàoHello, World !!! vào tệp.
Hãy để chúng tôi tạo một tệp với một số dữ liệu văn bản.
Thí dụ
[jerry]$ echo "Old data" > /tmp/message.txt [jerry]$ cat /tmp/message.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Old data
Bây giờ chúng ta hãy thêm một số nội dung vào nó bằng cách sử dụng toán tử chắp thêm của AWK.
Thí dụ
[jerry]$ awk 'BEGIN { print "Hello, World !!!" >> "/tmp/message.txt" }' [jerry]$ cat /tmp/message.txt
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
Old data
Hello, World !!!
Ống
Có thể gửi đầu ra đến chương trình khác thông qua đường ống thay vì sử dụng tệp. Việc chuyển hướng này mở ra một đường dẫn để ra lệnh và ghi giá trị của các mục qua đường dẫn này vào một quá trình khác để thực hiện lệnh. Lệnh đối số chuyển hướng thực sự là một biểu thức AWK. Đây là cú pháp của pipe -
Cú pháp
print items | command
Hãy để chúng tôi sử dụng tr lệnh chuyển chữ thường thành chữ hoa.
Thí dụ
[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
HELLO, WORLD !!!
Giao tiếp hai chiều
AWK có thể giao tiếp với một quy trình bên ngoài bằng cách sử dụng |&, đó là giao tiếp hai chiều. Ví dụ: ví dụ sau sử dụngtrlệnh chuyển chữ thường thành chữ hoa. Của chúng tôicommand.awk tệp chứa -
Thí dụ
BEGIN {
cmd = "tr [a-z] [A-Z]"
print "hello, world !!!" |& cmd
close(cmd, "to")
cmd |& getline out
print out;
close(cmd);
}
Khi thực thi mã này, bạn nhận được kết quả sau:
Đầu ra
HELLO, WORLD !!!
Kịch bản có khó hiểu không? Hãy để chúng tôi làm sáng tỏ nó.
Tuyên bố đầu tiên, cmd = "tr [a-z] [A-Z]", là lệnh mà chúng tôi thiết lập giao tiếp hai chiều từ AWK.
Câu lệnh tiếp theo, tức là, lệnh in cung cấp đầu vào cho trchỉ huy. Đây&| biểu thị giao tiếp hai chiều.
Câu lệnh thứ ba, tức là, close(cmd, "to"), đóng to xử lý sau khi cạnh tranh việc thực hiện của nó
Tuyên bố tiếp theo cmd |& getline out lưu trữ output thành biến out với sự hỗ trợ của hàm getline.
Câu lệnh in tiếp theo in đầu ra và cuối cùng là close hàm đóng lệnh.
Cho đến nay, chúng tôi đã sử dụng AWK's print và printfchức năng hiển thị dữ liệu trên đầu ra tiêu chuẩn. Nhưng printf mạnh hơn nhiều so với những gì chúng ta đã thấy trước đây. Chức năng này được mượn từ ngôn ngữ C và rất hữu ích khi tạo ra đầu ra có định dạng. Dưới đây là cú pháp của câu lệnh printf:
Cú pháp
printf fmt, expr-list
Trong cú pháp trên fmt là một chuỗi các đặc tả và hằng số định dạng. expr-list là danh sách các đối số tương ứng với các mã định dạng.
Trình tự thoát
Tương tự như bất kỳ chuỗi nào, định dạng có thể chứa các chuỗi thoát được nhúng. Thảo luận bên dưới là các trình tự thoát được AWK hỗ trợ -
Dòng mới
Bản in ví dụ sau Hello và World trong các dòng riêng biệt sử dụng ký tự dòng mới -
Example
[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Hello
World
Tab ngang
Ví dụ sau sử dụng tab ngang để hiển thị trường khác:
Example
[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'
Khi thực hiện đoạn mã trên, bạn nhận được kết quả sau:
Output
Sr No Name Sub Marks
Tab dọc
Ví dụ sau sử dụng tab dọc sau mỗi lần nộp -
Example
[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Sr No
Name
Sub
Marks
Backspace
Ví dụ sau sẽ in một khoảng lùi sau mỗi trường ngoại trừ trường cuối cùng. Nó xóa số cuối cùng khỏi ba trường đầu tiên. Ví dụ,Field 1 được hiển thị dưới dạng Field, bởi vì ký tự cuối cùng bị xóa bằng phím xóa lùi. Tuy nhiên, trường cuối cùngField 4 được hiển thị như nó vốn có, vì chúng tôi không có \b sau Field 4.
Example
[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Field Field Field Field 4
Vận chuyển trở lại
Trong ví dụ sau, sau khi in mọi trường, chúng tôi thực hiện Carriage Return và in giá trị tiếp theo lên trên giá trị được in hiện tại. Nó có nghĩa là, trong đầu ra cuối cùng, bạn chỉ có thể thấyField 4, vì nó là thứ cuối cùng được in trên tất cả các trường trước đó.
Example
[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Field 4
Thức ăn dạng
Ví dụ sau sử dụng nguồn cấp biểu mẫu sau khi in từng trường.
Example
[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Sr No
Name
Sub
Marks
Định dạng chỉ định
Như trong ngôn ngữ C, AWK cũng có các công cụ định dạng. Phiên bản AWK của câu lệnh printf chấp nhận các định dạng đặc tả chuyển đổi sau:
% c
Nó in một ký tự duy nhất. Nếu đối số được sử dụng cho%clà số, nó được coi như một ký tự và được in ra. Nếu không, đối số được giả định là một chuỗi và ký tự đầu tiên duy nhất của chuỗi đó được in.
Example
[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'
Output
Khi thực thi mã này, bạn nhận được kết quả sau:
ASCII value 65 = character A
% d và% i
Nó chỉ in phần nguyên của một số thập phân.
Example
[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Percentags = 80
% e và% E
Nó in ra một số dấu phẩy động có dạng [-] d.dddddde [+ -] dd.
Example
[jerry]$ awk 'BEGIN { printf "Percentags = %E\n", 80.66 }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Percentags = 8.066000e+01
Các %E định dạng sử dụng E thay vì e.
Example
[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Percentags = 8.066000E+01
% f
Nó in ra một số dấu phẩy động có dạng [-] ddd.dddddd.
Example
[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Percentags = 80.660000
% g và% G
Sử dụng chuyển đổi% e hoặc% f, tùy theo chuyển đổi nào ngắn hơn, với các số 0 không đáng kể bị loại bỏ.
Example
[jerry]$ awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'
Output
Khi thực thi mã này, bạn nhận được kết quả sau:
Percentags = 80.66
Các %G định dạng sử dụng %E thay vì% e.
Example
[jerry]$ awk 'BEGIN { printf "Percentags = %G\n", 80.66 }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Percentags = 80.66
% o
Nó in ra một số bát phân không dấu.
Example
[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Octal representation of decimal number 10 = 12
% u
Nó in một số thập phân không dấu.
Example
[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Unsigned 10 = 10
%S
Nó in ra một chuỗi ký tự.
Example
[jerry]$ awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Name = Sherlock Holmes
% x và% X
Nó in một số thập lục phân không dấu. Các%X định dạng sử dụng chữ hoa thay vì chữ thường.
Example
[jerry]$ awk 'BEGIN {
printf "Hexadecimal representation of decimal number 15 = %x\n", 15
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Hexadecimal representation of decimal number 15 = f
Bây giờ hãy sử dụng% X và quan sát kết quả -
Example
[jerry]$ awk 'BEGIN {
printf "Hexadecimal representation of decimal number 15 = %X\n", 15
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Hexadecimal representation of decimal number 15 = F
%%
Nó in một đĩa đơn % ký tự và không có đối số nào được chuyển đổi.
Example
[jerry]$ awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Percentags = 80%
Tham số tùy chọn với%
Với % chúng ta có thể sử dụng các tham số tùy chọn sau:
Chiều rộng
Trường được đệm vào width. Theo mặc định, trường được đệm bằng dấu cách nhưng khi cờ 0 được sử dụng, trường được đệm bằng số 0.
Example
[jerry]$ awk 'BEGIN {
num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Num1 = 10
Num2 = 20
Số không hàng đầu
Một số 0 đứng đầu hoạt động như một cờ, cho biết rằng đầu ra nên được đệm bằng các số 0 thay vì dấu cách. Xin lưu ý rằng cờ này chỉ có hiệu lực khi trường rộng hơn giá trị được in. Ví dụ sau đây mô tả điều này -
Example
[jerry]$ awk 'BEGIN {
num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Num1 = -0010
Num2 = 00020
Biện minh bên trái
Biểu thức phải được căn trái trong trường của nó. Khi chuỗi đầu vào ít hơn số ký tự được chỉ định và bạn muốn nó được căn trái, tức là bằng cách thêm dấu cách vào bên phải, hãy sử dụng ký hiệu dấu trừ (-) ngay sau% và trước số.
Trong ví dụ sau, đầu ra của lệnh AWK được nối với lệnh cat để hiển thị ký tự END OF LINE ($).
Example
[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Num = 10 $
Dấu hiệu tiền tố
Nó luôn đặt trước các giá trị số bằng một dấu, ngay cả khi giá trị là số dương.
Example
[jerry]$ awk 'BEGIN {
num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Num1 = -10
Num2 = +20
Băm
Đối với% o, nó cung cấp số 0 ở đầu. Đối với% x và% X, nó cung cấp giá trị 0x hoặc 0X ở đầu tương ứng, chỉ khi kết quả là khác 0. Đối với% e,% E,% f và% F, kết quả luôn chứa dấu thập phân. Đối với% g và% G, các số không ở cuối không bị xóa khỏi kết quả. Ví dụ sau đây mô tả điều này -
Example
[jerry]$ awk 'BEGIN {
printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10
}'
Khi thực thi mã này, bạn nhận được kết quả sau:
Output
Octal representation = 012
Hexadecimal representation = 0XA