Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Cách sử dụng lệnh awk trong Linux [Có ví dụ]

Hướng dẫn này chỉ cho bạn cách sử dụng lệnh awk trong Linux, với nhiều ví dụ hữu ích hàng ngày.

AWK là một công cụ và ngôn ngữ để tìm kiếm và thao tác văn bản có sẵn cho Hệ điều hành Linux.

awk lệnh và các tệp tìm kiếm ngôn ngữ kịch bản được liên kết cho văn bản được xác định bởi mẫu và thực hiện một hành động cụ thể trên văn bản phù hợp với mẫu.

awk là một công cụ hữu ích để trích xuất dữ liệu và xây dựng báo cáo từ các tệp văn bản lớn hoặc số lượng lớn tệp văn bản - ví dụ:nhật ký xử lý hoặc đầu ra của thiết bị ghi dữ liệu như đầu dò nhiệt độ, đã thu thập nhiều dữ liệu trong một khoảng thời gian . Nó cũng có thể được sử dụng trên đầu ra từ các truy vấn cơ sở dữ liệu.

Không cần cài đặt awk; nó đã có sẵn trên Hệ thống Linux của bạn.

Cú pháp awk

Cú pháp để sử dụng awk lệnh trong terminal như sau:

awk [PROGRAM] [INPUT FILES]

Lưu ý rằng:

  • [CHƯƠNG TRÌNH] là mẫu tìm kiếm và các hành động cần thực hiện - đó là chương trình bạn muốn awk chạy trên các tệp được cung cấp
    • Nó cũng có thể được cung cấp dưới dạng tệp văn bản thay vì nội tuyến bằng cách sử dụng -f tùy chọn
  • [INPUT FILES] là các tệp bạn muốn làm việc trên đó - nó có thể là một số tệp được phân tách bằng dấu cách hoặc đường dẫn đến một thư mục hoặc một mẫu tệp để khớp
    • Nếu không có tệp đầu vào nào được chỉ định, awk sẽ hoạt động trên đầu ra được định hướng từ một lệnh khác

Tùy chọn awk

Các tùy chọn sau có thể được cung cấp cho lệnh awk:

-f chương trình-tệp Văn bản chương trình được đọc từ tệp thay vì từ dòng lệnh. Nhiều tùy chọn -f được chấp nhận.
-F giá trị Đặt dấu phân tách trường, FS, thành giá trị.
-v var =value Gán giá trị cho biến chương trình var.

Để có thêm các tùy chọn triển khai cụ thể cho phiên bản awk của bạn, bạn có thể kiểm tra hướng dẫn sử dụng bằng cách chạy:

man awk

Hành động và biến chương trình

Chương trình bạn cung cấp cho awk sẽ xác định tác dụng của nó đối với các tệp văn bản mà bạn cung cấp cho nó. Chương trình awk có định dạng sau:

CONDITION { ACTION }
CONDITION { ACTION }
...

Ở đâu ĐIỀU KIỆN là mẫu văn bản để đối sánh và ACTION là hành động thực hiện trên văn bản phù hợp. Bạn có thể có nhiều điều kiện và hành động tùy ý.

Hành động

Các hành động được cung cấp là các lệnh có thể bao gồm tính toán, biến và gọi hàm. Một số chức năng tích hợp dành riêng cho việc triển khai, vì vậy tốt nhất bạn nên kiểm tra hướng dẫn sử dụng của mình để biết những chức năng này.

Hồ sơ

awk thường coi mỗi dòng mới trong tệp văn bản là một bản ghi trừ khi được chỉ định khác qua OPTIONS .

Các trường

awk sẽ sử dụng khoảng trắng (dấu cách, tab) để biểu thị các trường trong một hồ sơ trừ khi được chỉ định khác qua OPTIONS .

Các biến

awk có nhiều biến tích hợp mà bạn có thể sử dụng mà không cần phải tự xác định chúng, bao gồm một số trường hợp phổ biến:

Biến Ý nghĩa
$ 0 Đại diện cho toàn bộ bản ghi
$ 1, $ 2, $ 3… Biến trường - giữ văn bản / giá trị cho các trường văn bản riêng lẻ trong một bản ghi
NR / N umber của R sinh thái Số lượng bản ghi đầu vào hiện tại được đọc từ tất cả các tệp
FNR / F ile N umber của R sinh thái Đếm số lượng bản ghi đầu vào hiện tại đã đọc trong tệp hiện tại - Tự động đặt lại về 0 mỗi khi khởi động tệp mới
NF / N umber của F ields Số lượng trường trong bản ghi đầu vào hiện tại - Trường cuối cùng trong bản ghi có thể được tham chiếu bằng cách sử dụng $ NF, trường thứ 2 đến cuối cùng bằng cách sử dụng $ (NF-1), v.v.
FILENAME Tên của tệp đầu vào hiện tại
FS / F ield S dấu phân cách (Các) ký tự được sử dụng để phân tách các trường trong một bản ghi. Theo mặc định, bao gồm bất kỳ khoảng trắng và ký tự tab nào
RS / R ecord S dấu phân cách (Các) ký tự được sử dụng để phân tách các bản ghi trong một tệp. Dòng mới theo mặc định
OFS / O utput F ield S dấu phân cách (Các) ký tự được sử dụng để phân tách các trường trong đầu ra Awk. Mặc định là một không gian duy nhất
ORS / O utput R ecord S dấu phân cách (Các) ký tự được sử dụng để phân tách các trường trong đầu ra Awk. Mặc định là một dòng mới
OFMT / O utput F hoặc M a T Định dạng cho đầu ra số - Định dạng mặc định là “% .6g”

Ví dụ sử dụng awk

Đối với những ví dụ này, chúng tôi sẽ làm việc trên một tệp văn bản duy nhất có tên là flowers.txt , chứa văn bản sau:

red rose
yellow daffodil
pink flamingo
white rose
blue iris
white lily
red peony
yellow orchid
purple foxglove

In nội dung tệp

Lệnh awk sau đây sẽ xuất nội dung của tệp đến thiết bị đầu cuối bằng cách sử dụng awk print chức năng:

awk '{print}' flowers.txt

In số bản ghi (dòng) trong tệp

awk 'END { print NR }' sample.txt

Ví dụ này sẽ xuất ra số dòng trong tệp:

9

Tìm kiếm văn bản trong tệp bằng biểu thức chính quy

Lệnh sau sẽ xuất các dòng trong tệp chỉ mô tả các loại hoa hồng :

awk '/rose/' flowers.txt

Lưu ý rằng REGEX Cú pháp (Biểu thức chính quy) được sử dụng để xác định văn bản cần tìm kiếm.

Lệnh này sẽ xuất ra:

red rose
white rose

Thêm Regex

awk '/^p/' flowers.txt

Lệnh này sẽ chỉ xuất các bản ghi bắt đầu bằng p :

pink flamingo
purple foxglove

Sử dụng các biến trường

Bằng cách sử dụng Biến trường , bạn có thể xuất ra chỉ trường đầu tiên cho các bản ghi bắt đầu bằng p :

awk '/^p/ {print $1;}' flowers.txt

Cái nào sẽ xuất ra:

pink
purple

Xử lý đầu ra từ các chương trình khác

Bạn có thể tẩu xuất từ ​​các chương trình shell Linux khác sang awk để xử lý. Ví dụ này lấy đầu ra từ ls -l lệnh liệt kê nội dung của thư mục hiện tại và trả về nội dung của 5 trường (kích thước của tệp):

ls -l | awk '{print $5}'

Điều này sẽ xuất ra một cái gì đó như:

3104
3072
224
256

… (Tùy thuộc vào số lượng tệp trong thư mục hiện tại và dung lượng của chúng).

Sử dụng các biến tích hợp

awk '{print NR "-" $2 }' flowers.txt

Lệnh này sẽ in số bản ghi hiện tại (số dòng tệp) theo sau là trường thứ hai - tên của loài hoa:

1-red rose
2-yellow daffodil
3-pink flamingo
4-white rose
5-blue iris
6-white lily
7-red peony
8-yellow orchid
9-purple foxglove

Kết hợp các hành động

Điều kiện hành động có thể được kết hợp bằng cách sử dụng && Lệnh này sẽ in tất cả các bản ghi có trường đầu tiên chứa văn bản red và trường thứ hai có ít hơn 5 ký tự :

awk '$1 ~ /red/ && length($NF) < 5 { print }' flowers.txt

Lưu ý:

  • Việc sử dụng $ NF để chuyển đến trường thứ hai thay thế cho việc sử dụng $ 2 - có thể vì đây là trường cuối cùng và do đó bằng với NF (Số trường)
  • Chiều dài () hàm được sử dụng để tính độ dài của trường

Vì vậy, nó trả về một bản ghi phù hợp duy nhất từ ​​tệp ví dụ:

red rose

Kết luận

awk được bao gồm khá nhiều trên toàn cầu với Linux vì một lý do - đó là một công cụ chủ yếu để tìm kiếm và xử lý văn bản, bạn có thể sử dụng để nhanh chóng tìm kiếm các mục nhập nhật ký nếu có sự cố trên hệ thống của bạn hoặc để xử lý dữ liệu đã thu thập được để sử dụng cho nghiên cứu.

Nếu bạn đã từng cố gắng làm bất cứ điều gì ngoài việc tìm / thay thế đơn giản trên một bộ sưu tập lớn các tệp văn bản, bạn sẽ biết giá trị của việc có thể thực hiện thay thế hoặc cập nhật cụ thể cho tất cả văn bản của bạn theo chương trình mà không cần phải chạy các lệnh tìm / thay thế riêng lẻ.

Xem các Mẹo Linux khác của chúng tôi!