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ẫuCallTall 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 inBallCall.

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ụngassortasorti 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 printprintfchứ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 HelloWorld 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