Hàm awk trong linux

Trong Linux,

ai | awk '{in $ 1, $ 4}'
4 là một động lực thao tác văn bản dòng lệnh, cũng như một ngôn ngữ kịch bản mạnh mẽ. Đây là phần giới thiệu về một số tính năng thú vị hơn của nó.

tóm lại

Làm thế nào awk có tên của mình

le

ai | awk '{in $ 1, $ 4}'
4 Ủy ban được đặt tên theo tên viết tắt của ba người đã viết phiên bản gốc vào năm 1977: Alfred Aho, Peter Weinberger và Brian Kernighan. Ba người đàn ông này thuộc về đội Unix huyền thoại của Phòng thí nghiệm Bell AT&T. Với sự đóng góp của nhiều người khác kể từ đó,
ai | awk '{in $ 1, $ 4}'
4 tiếp tục phát triển.

Nó là một ngôn ngữ kịch bản hoàn chỉnh, cũng như một bộ công cụ thao tác văn bản hoàn chỉnh cho dòng lệnh. Nếu bài viết này kích thích sự thèm ăn của bạn, bạn có thể xem tất cả các chi tiết tại

ai | awk '{in $ 1, $ 4}'
4 và chức năng của nó.

Quy tắc, mô hình và hành động

ai | awk '{in $ 1, $ 4}'
4 hoạt động trên các chương trình có chứa các quy tắc được tạo thành từ các mô hình và hành động. Hành động được thực hiện trên văn bản phù hợp với mẫu. Các mẫu được bao quanh bởi dấu ngoặc nhọn [
ai | awk '{in $ 1, $ 4}'
9]. Cùng với nhau, một mô hình và một hành động tạo thành một quy tắc. Tất cả các
ai | awk '{in $ 1, $ 4}'
4 chương trình được đặt trong dấu nháy đơn [
con mèo dennis_ritchie.txt
1].

Chúng ta hãy xem xét loại đơn giản nhất của

ai | awk '{in $ 1, $ 4}'
4 chương trình. Nó không có mẫu, vì vậy nó khớp với mọi dòng văn bản được nhập vào nó. Điều này có nghĩa là hành động được thực hiện trên mỗi hàng. Chúng tôi sẽ sử dụng nó trên đầu ra của
con mèo dennis_ritchie.txt
3 đặt hàng.

Đây là đầu ra tiêu chuẩn của

con mèo dennis_ritchie.txt
3:

ai

Chúng tôi có thể không cần tất cả thông tin này, mà chỉ muốn xem tên trên các tài khoản. Chúng tôi có thể định hướng đầu ra của

con mèo dennis_ritchie.txt
3 trong
ai | awk '{in $ 1, $ 4}'
4, vậy thì nói đi
ai | awk '{in $ 1, $ 4}'
4 để chỉ in trường đầu tiên.

Theo mặc định,

ai | awk '{in $ 1, $ 4}'
4 coi một trường là một chuỗi ký tự được bao quanh bởi dấu cách, đầu dòng hoặc cuối dòng. Các trường được xác định bằng ký hiệu đô la [
con mèo dennis_ritchie.txt
9] và một số. Vì thế,
awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
0 đại diện cho trường đầu tiên, mà chúng tôi sẽ sử dụng với
awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
1 hành động để in trường đầu tiên.

Chúng tôi gõ như sau:

ai | awk '{print $ 1}'

ai | awk '{in $ 1, $ 4}'
4 in trường đầu tiên và xóa phần còn lại của dòng.

Chúng tôi có thể in bao nhiêu trường tùy thích. Nếu chúng ta thêm dấu phẩy làm dấu phân cách,

ai | awk '{in $ 1, $ 4}'
4 in một khoảng trắng giữa mỗi trường.

Chúng tôi nhập như sau để in thời gian người đó đã đăng nhập [trường bốn]:

ai | awk '{in $ 1, $ 4}'

Có một vài số nhận dạng trường đặc biệt. Chúng đại diện cho toàn bộ dòng văn bản và trường cuối cùng trong dòng văn bản:

  • 0 $: Đại diện cho toàn bộ dòng văn bản.
  • 1 $: Đại diện cho trường đầu tiên.
  • 2 $: Đại diện cho trường thứ hai.
  • 7 $: Đại diện cho trường thứ bảy.
  • 45 $: Đại diện cho trường thứ 45.
  • $ Nf.: Có nghĩa là "số trường" và đại diện cho trường cuối cùng.

Chúng tôi sẽ nhập nội dung sau để hiển thị một tệp văn bản nhỏ chứa một trích dẫn ngắn được gán cho Dennis Ritchie:

con mèo dennis_ritchie.txt

chúng tôi muốn

ai | awk '{in $ 1, $ 4}'
4 để in trường đầu tiên, thứ hai và trường cuối cùng của câu trích dẫn. Lưu ý rằng mặc dù nó được bao bọc trong cửa sổ đầu cuối, nhưng nó chỉ là một dòng văn bản.

Chúng tôi gõ lệnh sau:

awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt

Chúng tôi không biết điều này "đơn giản". là trường thứ 18 trong dòng văn bản và chúng tôi không quan tâm. Những gì chúng tôi biết là đây là trường cuối cùng và chúng tôi có thể sử dụng

awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
5 để nhận được giá trị của nó. Dấu chấm chỉ đơn giản được xem như một ký tự khác trong phần thân của trường.

Thêm dấu phân tách trường đầu ra

Bạn cũng có thể nói

ai | awk '{in $ 1, $ 4}'
4 để in một ký tự cụ thể giữa các trường thay vì ký tự khoảng trắng mặc định. Đầu ra mặc định của
awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
7 thứ tự có một chút đặc biệt vì thời gian bị giảm xuống ở giữa. Tuy nhiên, chúng ta có thể gõ như sau và sử dụng
ai | awk '{in $ 1, $ 4}'
4 để trích xuất các trường chúng tôi muốn:

ngày
ngày tháng | awk '{print $ 2, $ 3, $ 6}'

Chúng tôi sẽ sử dụng

awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
9 [dấu phân tách trường đầu ra] để đặt dấu phân cách giữa tháng, ngày và năm. Lưu ý rằng bên dưới chúng tôi đặt lệnh trong dấu ngoặc kép [
con mèo dennis_ritchie.txt
1], không phải dấu ngoặc nhọn [
ai | awk '{in $ 1, $ 4}'
9]:

ngày tháng | awk 'OFS = "/" {print $ 2, $ 3, $ 6}'
ngày tháng | awk 'OFS = "-" {print $ 2, $ 3, $ 6}'

Quy tắc BEGIN và END

Một

ngày
2 được thực thi một lần trước khi bắt đầu xử lý văn bản. Trên thực tế, nó được thực thi trước khi
ai | awk '{in $ 1, $ 4}'
4 thậm chí đọc bất kỳ văn bản nào. Một
ngày
4 quy tắc được thực thi sau khi tất cả quá trình xử lý hoàn tất. Bạn có thể có một vài
ngày
2 et
ngày
4 và chúng sẽ chạy theo thứ tự.

Ví dụ của chúng tôi về một

ngày
2 quy tắc, chúng tôi sẽ in toàn bộ trích dẫn từ
ngày
8 tệp chúng tôi đã sử dụng trước đây với tiêu đề ở trên.

Để thực hiện việc này, chúng ta gõ lệnh sau:

awk 'BEGIN {print "Dennis Ritchie"} {print $ 0}' dennis_ritchie.txt

Lưu ý

ngày
2 quy tắc có một tập hợp các hành động riêng của nó được bao bọc trong một tập hợp các dấu ngoặc nhọn riêng của nó [
ai | awk '{in $ 1, $ 4}'
9].

Chúng ta có thể sử dụng kỹ thuật tương tự với lệnh mà chúng ta đã sử dụng trước đó để điều hướng đầu ra của

con mèo dennis_ritchie.txt
3 trong
ai | awk '{in $ 1, $ 4}'
4. Để làm điều này, chúng tôi nhập như sau:

ai | awk '{print $ 1}'
0

Dấu phân tách trường đầu vào

Nếu bạn muốn

ai | awk '{in $ 1, $ 4}'
4 để làm việc với văn bản không sử dụng dấu cách để phân tách các trường, bạn phải cho nó biết ký tự nào mà văn bản sử dụng làm dấu phân cách trường. Ví dụ,
ngày tháng | awk '{print $ 2, $ 3, $ 6}'
4 tệp sử dụng dấu hai chấm [
ngày tháng | awk '{print $ 2, $ 3, $ 6}'
5] để tách các trường.

Chúng tôi sẽ sử dụng tệp này và

ngày tháng | awk '{print $ 2, $ 3, $ 6}'
6 [chuỗi phân tách] tùy chọn để nói
ai | awk '{in $ 1, $ 4}'
4 để sử dụng dấu hai chấm [
ngày tháng | awk '{print $ 2, $ 3, $ 6}'
5] như một dấu phân cách. Chúng tôi gõ như sau để nói
ai | awk '{in $ 1, $ 4}'
4 để in tên của tài khoản người dùng và thư mục cá nhân:

ai | awk '{print $ 1}'
1

Đầu ra chứa tên của tài khoản người dùng [hoặc tên của ứng dụng hoặc daemon] và thư mục chính [hoặc vị trí của ứng dụng].

Thêm các mẫu

Nếu tất cả những gì chúng tôi quan tâm là tài khoản người dùng thông thường, chúng tôi có thể bao gồm một mẫu với hành động in của chúng tôi để lọc ra tất cả các mục nhập khác. Vì số ID người dùng bằng hoặc lớn hơn 1, chúng tôi có thể dựa trên bộ lọc của mình dựa trên thông tin này.

Chúng tôi nhập nội dung sau để thực hiện hành động in của chúng tôi chỉ khi trường thứ ba [

ngày tháng | awk 'OFS = "/" {print $ 2, $ 3, $ 6}'
0] chứa giá trị từ 1 trở lên:

ai | awk '{print $ 1}'
2

= 1000 Lệnh {print $ 1, $ 6} '/ etc / passwd "trong cửa sổ dòng lệnh". width = "646" height = "147" src = "/ pagespeed_static / 1.JiBnMqyl6S.gif" onload = "pagespeed.lazyLoadImages.loadIfVosystemAndMaybeBeacon [this];" onerror = "this.onerror = null; pagespeed.lazyLoadImages.loadIfVosystemAndMaybeBeacon [this];" />

Mô hình phải ngay trước hành động mà nó được liên kết.

Chúng ta có thể sử dụng

ngày
2 quy tắc để đặt tiêu đề cho báo cáo nhỏ của chúng tôi. Chúng tôi gõ như sau, sử dụng [
ngày tháng | awk 'OFS = "/" {print $ 2, $ 3, $ 6}'
2] ký hiệu để chèn một ký tự dòng mới vào chuỗi tiêu đề:

ai | awk '{print $ 1}'
3

= 1000 Lệnh {print $ 1, $ 6} '/ etc / passwd "trong cửa sổ dòng lệnh". width = "646" height = "212" src = "/ pagespeed_static / 1.JiBnMqyl6S.gif" onload = "pagespeed.lazyLoadImages.loadIfVosystemAndMaybeBeacon [this];" onerror = "this.onerror = null; pagespeed.lazyLoadImages.loadIfVosystemAndMaybeBeacon [this];" />

Các mẫu là biểu thức chính quy theo đúng nghĩa của chúng và chúng là một trong những vinh quang của

ai | awk '{in $ 1, $ 4}'
4.

Giả sử chúng ta muốn xem các mã định danh duy nhất [UUID] của các hệ thống tệp được gắn kết. Nếu chúng ta tìm kiếm thông qua

ngày tháng | awk 'OFS = "/" {print $ 2, $ 3, $ 6}'
4 tệp cho các lần xuất hiện của chuỗi "UUID", nó sẽ trả lại thông tin đó cho chúng tôi.

Chúng tôi sử dụng mẫu tìm kiếm "/ UUID /" trong lệnh của mình:

ai | awk '{print $ 1}'
4

Nó tìm tất cả các lần xuất hiện của "UUID" và in ra các dòng đó. Trên thực tế, chúng tôi sẽ đạt được kết quả tương tự nếu không có

awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
1 vì hành động mặc định sẽ in toàn bộ dòng văn bản. Tuy nhiên, để rõ ràng, nó thường giúp rõ ràng. Khi duyệt qua tập lệnh hoặc tệp lịch sử của mình, bạn sẽ rất vui vì đã để lại manh mối cho chính mình.

Dòng đầu tiên được tìm thấy là dòng nhận xét và mặc dù chuỗi "UUID" ở giữa,

ai | awk '{in $ 1, $ 4}'
4 vẫn được tìm thấy. Chúng tôi có thể sửa đổi biểu thức chính quy và nói
ai | awk '{in $ 1, $ 4}'
4 chỉ xử lý các dòng bắt đầu bằng "UUID". Để thực hiện việc này, chúng tôi nhập dòng sau bao gồm mã thông báo đầu dòng [
ngày tháng | awk 'OFS = "/" {print $ 2, $ 3, $ 6}'
8]:

ai | awk '{print $ 1}'
5

Thế tốt hơn rồi! Bây giờ chúng ta chỉ xem hướng dẫn lắp ráp chính hãng. Để tinh chỉnh thêm đầu ra, chúng tôi nhập nội dung sau và giới hạn hiển thị ở trường đầu tiên:

ai | awk '{print $ 1}'
6

Nếu chúng tôi có nhiều hệ thống tệp được gắn trên máy này, chúng tôi sẽ nhận được một bảng gọn gàng về các UUID của chúng.

Các chức năng tích hợp

ai | awk '{in $ 1, $ 4}'
4 có nhiều chức năng mà bạn có thể gọi và sử dụng trong các chương trình của riêng mình, từ dòng lệnh và trong các tập lệnh. Nếu bạn đào, bạn sẽ thấy nó rất thành công.

Để chứng minh kỹ thuật chung để gọi một hàm, chúng ta hãy xem xét một số kỹ thuật số. Ví dụ, sau đây in ra căn bậc hai của 625:

ai | awk '{print $ 1}'
7

Lệnh này hiển thị arctang của 0 [không] và -1 [xảy ra là hằng số toán học, pi]:

ai | awk '{print $ 1}'
8

Trong lệnh sau, chúng tôi sửa đổi kết quả của lệnh

ngày tháng | awk 'OFS = "-" {print $ 2, $ 3, $ 6}'
0 chức năng trước khi in nó:

ai | awk '{print $ 1}'
9

Các hàm có thể chấp nhận các biểu thức dưới dạng tham số. Ví dụ, đây là một cách phức tạp để yêu cầu căn bậc hai của 25:

ai | awk '{in $ 1, $ 4}'
0

Tập lệnh awk

Nếu dòng lệnh của bạn trở nên phức tạp hoặc bạn phát triển một quy trình mà bạn biết rằng bạn sẽ muốn sử dụng lại, bạn có thể chuyển

ai | awk '{in $ 1, $ 4}'
4 lệnh trong một tập lệnh.

Trong tập lệnh mẫu của chúng tôi, chúng tôi sẽ thực hiện tất cả những điều sau:

  • Cho trình bao biết tệp thực thi nào được sử dụng để chạy tập lệnh.
  • Chuẩn bị
    ai | awk '{in $ 1, $ 4}'
    4 sử dụng
    ngày tháng | awk 'OFS = "-" {print $ 2, $ 3, $ 6}'
    3 biến phân tách trường để đọc văn bản đầu vào với các trường được phân tách bằng dấu hai chấm [
    ngày tháng | awk '{print $ 2, $ 3, $ 6}'
    5].
  • Sử dụng
    awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt
    9 dấu phân tách trường đầu ra để nói
    ai | awk '{in $ 1, $ 4}'
    4 để sử dụng dấu hai chấm [
    ngày tháng | awk '{print $ 2, $ 3, $ 6}'
    5] để tách các trường khỏi đầu ra.
  • Đặt bộ đếm thành 0 [không].
  • Đặt trường thứ hai trong mỗi dòng văn bản thành một giá trị trống [nó luôn là "x", vì vậy chúng ta không cần nhìn thấy nó].
  • In dòng có trường sửa đổi thứ hai.
  • Tăng bộ đếm.
  • In giá trị bộ đếm.

Kịch bản của chúng tôi được hiển thị bên dưới.

le

ngày
2 quy tắc thực hiện các bước chuẩn bị, trong khi
ngày
4 Thước hiển thị giá trị của bộ đếm. Quy tắc giữa [không có tên hoặc mẫu phù hợp với từng hàng] thay đổi trường thứ hai, in hàng và tăng bộ đếm.

Dòng đầu tiên của tập lệnh cho shell biết tệp thực thi nào được sử dụng [

ai | awk '{in $ 1, $ 4}'
4, trong ví dụ của chúng tôi] để chạy tập lệnh. Nó cũng vượt qua
awk 'BEGIN {print "Dennis Ritchie"} {print $ 0}' dennis_ritchie.txt
1 tùy chọn [tên tệp] cho
ai | awk '{in $ 1, $ 4}'
4, thông báo cho nó rằng văn bản mà nó sẽ xử lý sẽ đến từ một tệp. Chúng tôi sẽ chuyển tên tệp cho tập lệnh khi chúng tôi chạy nó.

Chúng tôi đã bao gồm tập lệnh bên dưới dưới dạng văn bản để bạn có thể cắt và dán:

ai | awk '{in $ 1, $ 4}'
1

Lưu nó vào một tệp có tên

awk 'BEGIN {print "Dennis Ritchie"} {print $ 0}' dennis_ritchie.txt
3. Để làm cho tập lệnh có thể thực thi được, chúng ta gõ như sau bằng cách sử dụng
awk 'BEGIN {print "Dennis Ritchie"} {print $ 0}' dennis_ritchie.txt
4:

ai | awk '{in $ 1, $ 4}'
2

Bây giờ chúng tôi sẽ chạy nó và sử dụng

ngày tháng | awk '{print $ 2, $ 3, $ 6}'
4 tập tin sang tập lệnh. Đây là thư mục
ai | awk '{in $ 1, $ 4}'
4 sẽ xử lý cho chúng tôi, sử dụng các quy tắc của tập lệnh:

ai | awk '{in $ 1, $ 4}'
3

Tệp được xử lý và từng dòng được hiển thị, như hình dưới đây.

Các mục nhập "x" trong trường thứ hai đã bị xóa, nhưng lưu ý rằng dấu phân cách trường vẫn còn. Các dòng được đếm và tổng số được đưa ra ở cuối đầu ra.

awk không có nghĩa là khó xử

ai | awk '{in $ 1, $ 4}'
4 không đại diện cho sự khó xử; nó thể hiện sự sang trọng. Anh ta đã được mô tả như một bộ lọc xử lý và người viết báo cáo. Cụ thể, nó là cả hai, hay đúng hơn là một công cụ mà bạn có thể sử dụng cho cả hai tác vụ này. Trong một vài dòng,
ai | awk '{in $ 1, $ 4}'
4 đạt được những gì yêu cầu mã hóa rộng rãi bằng ngôn ngữ truyền thống.

Sức mạnh này được khai thác bởi khái niệm đơn giản về các quy tắc chứa các mô hình, chọn văn bản sẽ được xử lý và các hành động xác định quá trình xử lý.

Chủ Đề