Vẫn còn lý do gì để học AWK?


109

Tôi không ngừng học hỏi các công cụ mới, thậm chí cả những công cụ lỗi thời, bởi vì tôi thích sử dụng giải pháp phù hợp cho vấn đề.

Tuy nhiên, tôi tự hỏi liệu vẫn còn lý do gì để học một số trong số chúng. awkví dụ là thú vị với tôi, nhưng đối với xử lý văn bản đơn giản, tôi có thể sử dụng grep, cut, sedvv trong khi đối với những phức tạp, tôi sẽ đi cho Python.

Bây giờ tôi không có nghĩa đó không phải là một công cụ mạnh mẽ và tiện dụng. Nhưng vì nó cần thời gian và năng lượng để học một công cụ mới, nó có đáng không?


2
đó là năm 2019 và tôi vừa viết lại trình chuẩn hóa nhật ký python trong awk. Tôi đã chạy biến đổi trong một tuần các tệp nhật ký có 54 triệu tệp nhật ký dòng (~ 9GB). Trên Macbook Pro của tôi (2,8 GHZ i7, Ram 16 GB), phiên bản python có thể xử lý ~ 10k dòng một giây => 90 phút thời gian chạy. Sử dụng mawk, thời gian chạy giảm xuống còn 2 phút. Btw, chương trình awk chỉ bằng một nửa.
mistahenry

@mistahenry bạn đã thử pypy chưa?
qwr

Câu trả lời:


97

Tôi nghĩ điều đó phụ thuộc vào môi trường mà bạn thấy mình. Nếu bạn là một người * nix, thì hiểu biết awklà một Điều tốt. Môi trường tập lệnh khác duy nhất có thể được tìm thấy trên hầu như mọi * nix là sh. Vì vậy, trong khi grep, sed,vv chắc chắn có thể thay thế awktrên một bản phân linuxphối chính thống hiện đại , khi bạn chuyển sang các hệ thống kỳ lạ hơn, biết một chút awksẽ trở thành Thực tế.

awkcũng có thể được sử dụng cho nhiều hơn là xử lý văn bản. Ví dụ, một trong những người giám sát của tôi viết mã thiên văn học awk- đó là trường học cũtuyệt vời như thế nào anh ta tuyệt vời . Quay lại thời của anh ấy, nó là công cụ tốt nhất cho công việc ... và bây giờ mặc dù những sinh viên của anh ấy như tôi sử dụng python và những gì không, anh ấy vẫn bám vào những gì anh ấy biết và hoạt động tốt.

Kết lại, có rất nhiều mã cổ lỗ trên khắp thế giới, biết một chút awksẽ không bị tổn thương. Nó cũng sẽ giúp bạn tốt hơn * nix person :-)


12
++ Đồng ý, awk thực sự là một trong những công cụ di động nhất và quan trọng, nhất quán trong bộ công cụ * nix. Ví dụ, nó hoạt động đáng tin cậy trên busybox, nơi không tìm thấy perl.
súng

1
Và nó thực sự không khó học nếu bạn đã quen với các ngôn ngữ dấu ngoặc nhọn
gun

2
"Nó giống nhau trong bất kỳ môi trường nào" - không hoàn toàn: trong Windows các dấu ngoặc kép phải được thay thế bằng dấu ngoặc kép, s và dấu ngoặc kép bên trong phải được thoát ra. (Windows là một môi trường thực tế, ngay cả khi việc phơi bày bản thân trước hành động tàn bạo chưa hoàn thiện của Redmond khiến bạn phải chịu sự thương xót của bất kỳ đứa trẻ Nga 15 tuổi nào).
GT.

6
Tôi không nghĩ rằng nhiều người liên tưởng sự tồn tại của awk và cửa sổ trong vũ trụ cùng .....: P
FoldedChromatin

2
Vẫn sử dụng awk cho các công việc xử lý văn bản. Tôi thường sẽ bắt đầu một tập lệnh bằng thứ gì đó khác (ruby, python) và cuối cùng quay lại awk vì sự đơn giản và sức mạnh.
Rumbleweed

103

Nếu bạn nhanh chóng tìm hiểu những điều cơ bản về awk, bạn thực sự có thể làm được những điều tuyệt vời trên dòng lệnh.

Nhưng lý do thực sự để học awk là có cớ để đọc cuốn sách tuyệt vời Ngôn ngữ lập trình AWK của các tác giả Aho, Kernighan và Weinberger. Bạn sẽ nghĩ, ngay từ cái tên, nó chỉ đơn giản là dạy cho bạn biết điều đó. Thực ra, đó mới chỉ là sự khởi đầu. Khai thác một loạt các vấn đề có thể được giải quyết khi người ta sử dụng ngôn ngữ kịch bản ngắn gọn giúp thao tác chuỗi dễ dàng - và awk là một trong những vấn đề đầu tiên - nó tiếp tục dạy người đọc cách triển khai cơ sở dữ liệu, trình phân tích cú pháp, trình thông dịch và (nếu bộ nhớ phục vụ tôi) một trình biên dịch cho một ngôn ngữ máy tính dành riêng cho dự án nhỏ! Giá như họ lập trình một hệ điều hành ví dụ bằng awk, cuốn sách sẽ là một cuộc khảo sát giới thiệu khá đầy đủ về khoa học máy tính!

Nổi tiếng rõ ràng và ngắn gọn, giống như cuốn sách Ngôn ngữ C gốc, nó cũng là một ví dụ tuyệt vời về cách viết kỹ thuật thân thiện được thực hiện đúng. Ngay cả chỉ số cũng là một phần của sự khéo léo.

Ồ? Nếu bạn biết nó, thỉnh thoảng bạn sẽ sử dụng nó ở dòng lệnh, nhưng đối với bất kỳ thứ gì lớn hơn, bạn sẽ cảm thấy bị mắc kẹt, không thể truy cập vào các tính năng rộng hơn của hệ thống của bạn và Internet mà một thứ như Python cung cấp quyền truy cập. Nhưng cuốn sách? Bạn sẽ luôn vui khi đọc nó!


5
+1 Đã bán. Tôi sẽ đặt mua cuốn sách này. Tôi đã sử dụng awk trong nhiều năm như một ngôn ngữ kịch bản một lớp nhanh chóng và mạnh mẽ. Awk là một bộ xử lý trước tuyệt vời cho các tệp mà nếu không sẽ mất hàng chục dòng để viết mã. Tôi không thể đếm được mình đã sử dụng biểu mẫu bao nhiêu lần: awk '{print $ 1, $ 2}'
galaxywatcher

2
Đã đồng ý. Nó gần như thách thức niềm tin rằng cuốn sách đó nhỏ gọn như thế nào được cho tất cả những gì nó chứa đựng. Nó bao gồm nhiều hơn hầu hết các cuốn sách đương thời trong 1/10 (?) Chiều dài.
đất sét vào

3
Tôi đang đọc cuốn sách này ngay bây giờ và nó đã khiến tôi nhiệt tình với nó đến mức gần như bị ám ảnh.
galaxywatcher

3
Xem thêm Gawk xuất sắc : Lập trình AWK hiệu quả .
lhf 28/09/12

1
Tôi chỉ mới đọc chương đầu tiên. Thật là kinh ngạc. Lỗi lầm đã được giải quyết.
vaichiosystemar

29

Lý do duy nhất tôi sử dụng awklà tự động tách:

awk '{print $3}' < file.in

Thao tác này in ra trường được phân cách bằng khoảng trắng thứ ba trong file.in. Nó dễ dàng hơn một chút so với:

tr -s ' ' < file.in | cut -d' ' -f3

3
tại sao sử dụng awk '{print $3}' < file.inthay vì awk '{print $3}' file.in? Có phải awk đã đọc tệp khi được truyền dưới dạng đối số không?
mbigras

@mbigras Chắc chắn, bạn có thể sử dụng awk theo cả hai cách.
Greg Hewgill

Ngay cả với doubleize, tôi vẫn thích giải pháp non-awk. Và tôi không biết tại sao tôi ghét awk: /
MD. Mohiuddin Ahmed

25

Tôi nghĩ awk là tuyệt vời nếu tệp của bạn chứa các cột / trường . Tôi sử dụng nó khi xử lý / phân tích một cột cụ thể trong tệp đa cột. Hoặc nếu tôi muốn thêm / xóa (các) cột cụ thể.

ví dụ

awk -F \t '{ if ($2 > $3) print; }' <filename>

sẽ chỉ in nếu giá trị cột thứ 2 trong tệp được phân tách bằng tab lớn hơn giá trị cột thứ 3.

Tất nhiên tôi có thể sử dụng Perl hoặc Python, nhưng awk làm cho nó đơn giản hơn rất nhiều với một lệnh dòng ngắn gọn.

Ngoài ra học awk là khá thấp chi phí. Bạn có thể học kiến ​​thức cơ bản về awk trong vòng chưa đầy một giờ, vì vậy nó không tốn nhiều công sức như học bất kỳ ngôn ngữ lập trình / kịch bản nào khác.


Mặc dù tôi không thực sự sử dụng awk nhiều, nhưng đây là một công dụng tuyệt vời cho awk.
Paul Nathan

8

Tôi thỉnh thoảng sử dụng AWK để xử lý HTML. Ví dụ: mã này dịch các bảng thành tệp csv:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

Thật tuyệt nếu bạn đang sàng lọc. Trên thực tế, có thể là trường hợp tôi yêu thích AWK vì nó cho phép tôi xây dựng giải pháp sai cho các vấn đề quá nhanh :) nhiều ví dụ hơn . Nó cũng được đề cập trong Những viên ngọc trai lập trình đáng yêu của Jon Bentley .


7

Tôi thường xuyên sử dụng awk. Nó tốt cho việc xáo trộn văn bản rất đơn giản ở giữa đường dẫn; nó lấp đầy một ngách rất hẹp giữa việc không cần đến nó và cần loại bỏ Perl / Python / bất cứ thứ gì.

Tôi sẽ không khuyên bạn dành nhiều thời gian cho nó, nhưng có thể hữu ích nếu bạn biết những điều cơ bản về cú pháp - ít nhất là đủ để bạn có thể tham khảo hướng dẫn sử dụng một cách nhanh chóng nếu bạn muốn sử dụng nó.


5

Hầu hết các lớp lót awk one đều có thể đạt được với Perl one liner - nếu bạn chọn theo tư duy Perl one lót. Hoặc, chỉ cần sử dụng Perl ba lớp lót :)

Nếu bạn đang duy trì các kịch bản shell được viết bởi một người thích awk, thì rõ ràng, bạn sẽ cần phải học awk.

Ngay cả khi không có nhu cầu thực tế, nếu bạn đã biết regex, bạn sẽ không mất nhiều thời gian để tìm hiểu những điều cơ bản và thật vui khi thấy mọi thứ được thiết kế như thế nào vào thời điểm đó. Nó khá thanh lịch.


5

6 năm sau khi hỏi câu hỏi này, bây giờ tôi có thể trả lời một cách chắc chắn: không, học awk là không đáng.

Các tác vụ cơ bản là xử lý nhưng các lệnh bash cơ bản, hoặc thậm chí các công cụ GUI một cách dễ dàng. Các tác vụ phức tạp hơn sẽ dễ dàng được giải quyết bằng các ngôn ngữ động hiện đại như Python (fav hoặc mine) hoặc Ruby.

Bạn nên cố gắng học một ngôn ngữ động lập trình kịch bản hiện đại vì nó sẽ giúp bạn trong rất nhiều tác vụ (web, quản trị, xử lý dữ liệu, tự động hóa, v.v.). Và bằng cách đó, học một công cụ như awk là hoàn toàn vô dụng, nó sẽ giúp bạn tiết kiệm tối đa vài giây mỗi tháng.


2
Không nhất thiết phải đúng. Nếu bạn đang phân tích cú pháp các tệp thực sự lớn, nó có thể nhanh hơn nhiều so với các công cụ khác.
user1071847

Thật thú vị bởi vì một vài năm sau điều này, bạn vẫn còn đặt câu hỏi về awk. Tôi là một trong những phản ứng ban đầu và vẫn sử dụng nó với một số đều đặn cho đến ngày nay
Dexygen

4

Nếu bạn đã biết và sử dụng sed, bạn cũng có thể nhận được ít nhất một chút awk. Chúng có thể được ghép nối với nhau cho một số thủ thuật khá mạnh mẽ. Luôn gây ấn tượng mạnh với khán giả.


4

Computerworld gần đây đã thực hiện một cuộc phỏng vấn với Alfred V. Aho (một trong ba người tạo ra AWK) về AWK. Đó là một bài đọc khá thú vị. Vì vậy, có thể bạn sẽ tìm thấy một số gợi ý trong đó, tại sao bạn nên tìm hiểu AWK.


Đẹp, nhưng không thuyết phục tôi. AWK là một công cụ rất tốt, nhưng tôi nghĩ rằng tôi sẽ không bao giờ cần nó đủ để dành thời gian tìm hiểu nó thay vì hack giải pháp của tôi trong sed hoặc python.
e-thoả mãn

4

Học AWK là vô giá đối với tôi trong hợp đồng cuối cùng của tôi làm việc trên một hệ thống Linux nhúng trên đó cả Perl và hầu hết các ngôn ngữ kịch bản khác đều không được cài đặt.


2
9 năm sau đó và tôi đã sử dụng awk rất nhiều trong phiên hôm nay grepping bản ghi git
Dexygen

3

awk có một tỷ lệ tiện ích / độ khó rất tốt, và "awk đơn giản" hoạt động trong mọi Unix / Linux / MacOS (và nó cũng có thể được cài đặt trong các hệ thống khác).

Nó được thiết kế vào thời kỳ hoàng kim khi mọi người ghét đánh máy, vì vậy các tập lệnh có thể rất, rất ngắn và nhanh để viết. Tôi sẽ cố gắng cài đặt mawk, một phiên bản nhanh, được cho là nó tăng tốc tính toán khoảng 9 lần, awk / gawk khá chậm, vì vậy nếu bạn muốn sử dụng nó thay vì R, v.v. bạn có thể muốn mawk.


2

Nó hữu ích hầu hết nếu bạn thỉnh thoảng phải phân tích cú pháp tệp nhật ký cho dữ liệu hoặc đầu ra của chương trình trong khi viết kịch bản shell, bởi vì nó rất dễ đạt được trong awk, điều đó sẽ khiến bạn mất thêm một chút dòng mã trong python.

Nó chắc chắn có nhiều sức mạnh hơn thế, nhưng đây dường như là nhiệm vụ mà hầu hết mọi người sử dụng nó.


2

Tất nhiên: Tôi đang làm việc trong một môi trường mà các ngôn ngữ khả dụng duy nhất là: (một số ngôn ngữ xảo quyệt tạo ra COBOL, OMG, OMG), bash (phiên bản cũ), perl (tôi chưa thành thạo), sed, awk , và một số tiện ích dòng lệnh khác. Việc biết awkđã giúp tôi tiết kiệm được vài giờ (và đã tạo ra một số tác vụ xử lý văn bản từ các đồng nghiệp của tôi - chúng đến với tôi ít nhất ba lần một ngày).


1

Tôi muốn nói rằng nó có lẽ không còn giá trị nữa. Đôi khi tôi sử dụng nó như một trình chỉnh sửa luồng linh hoạt hơn sed với khả năng tìm kiếm được bao gồm, nhưng nếu bạn thành thạo với python, tôi không biết nhiệm vụ nào mà bạn có thể hoàn thành nhanh hơn nhiều để bù lại thời gian cần thiết để học awk.

Lệnh sau có lẽ là lệnh duy nhất mà tôi đã sử dụng awk trong hai năm qua (nó xóa các gói bị xóa một nửa khỏi hệ thống Debian / Ubuntu của tôi):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P

1

Không.

Mặc dù nó có thể thú vị, nhưng bạn có thể làm mọi thứ mà awk có thể làm bằng cách sử dụng các công cụ khác mạnh hơn như Perl.

Dành thời gian của bạn để tìm hiểu những công cụ mạnh mẽ hơn - và chỉ tình cờ nhặt được một số awk trên đường đi.


1

Tôi muốn nói là có. Đối với những thứ đơn giản, AWK dễ dàng hơn rất nhiều đối với sysadmin / nhà phát triển thiếu kinh nghiệm so với Python. Bạn có thể học một chút AWK và làm được nhiều thứ, học Python có nghĩa là học một ngôn ngữ hoàn toàn mới (vâng, tôi biết AWK là một ngôn ngữ cũng là một ý nghĩa).

Perl có thể làm rất nhiều thứ mà AWK có thể làm, nhưng đưa ra sự lựa chọn trong thời đại ngày nay, tôi sẽ chọn Python ở đây. Vì vậy, có, bạn nên học AWK. nhưng cũng phải học Python :-)


1

awklà một ngôn ngữ powertool, vì vậy bạn có thể sẽ thấy awknó đang được sử dụng ở đâu đó nếu bạn là một chuyên gia CNTT. Nếu bạn có thể xử lý cú pháp và biểu thức chính quy của grepsedthì bạn sẽ không gặp vấn đề gì khi chọn awkvà nó có lẽ đáng giá.

Nơi tôi thấy awkthực sự tỏa sáng là trong việc đơn giản hóa những thứ như xử lý các bản ghi nhiều dòng và xử lý / nội suy nhiều tệp đồng thời.


0

Bây giờ PERL đã được chuyển sang khá nhiều nền tảng quan trọng, tôi muốn nói rằng nó không đáng. Nó linh hoạt hơn sed và awk cùng nhau. Đối với tự động tách, bạn có thể làm điều đó trong perl như sau:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

EDIT: bạn vẫn có thể muốn để có được phần nào quen với awk, bởi vì một số công cụ khác được dựa trên triết lý của nó các hành động dựa trên mô hình (ví dụ DTrace trên Solaris).


0

Tôi làm việc trong khu vực các tệp có định dạng cột. Vì vậy, awk là vô giá đối với tôi để CẢI TẠO tệp để các phần mềm khác nhau có thể hoạt động cùng nhau. Đối với những người không chuyên về CNTT, sử dụng awk là đủ và hoàn hảo. Bây giờ một ngày, tốc độ máy tính không phải là vấn đề, vì vậy tôi có thể kết hợp awk & unix để ghép nhiều lệnh 1 lót vào một "tập lệnh". Với tìm kiếm Awk theo trường và bản ghi, tôi sử dụng nó để kiểm tra dữ liệu tệp rất nhanh, thay vì "vi" để mở tệp. Tôi phải nói khả năng awk đã mang lại niềm vui cho công việc của tôi, đặc biệt, tôi có thể hỗ trợ đồng nghiệp sắp xếp mọi thứ nhanh chóng bằng cách sử dụng awk. Mã tuyệt vời đối với tôi.


0

Gần đây tôi đang cố gắng hình dung các tệp pcap mạng ghi lại một cuộc tấn công DOS có dung lượng hơn 20Gbs. Tôi cần dấu thời gian và địa chỉ Ip. Trong kịch bản của tôi, AWK một lớp cũng hoạt động tuyệt vời và khá nhanh. Tôi đặc biệt sử dụng AWK để làm sạch các tệp đã giải nén, lấy địa chỉ ip và tổng số gói từ các địa chỉ IP đó trong khoảng thời gian được nhóm lại. Tôi hoàn toàn đồng ý với những gì người khác đã viết ở trên. Nó phụ thuộc vào nhu cầu của bạn.


0

Một lý do KHÔNG ĐƯỢC học awk là nó không có các kết quả phù hợp không tham lam trong biểu thức chính quy.

Tôi có một mã awk mà bây giờ tôi phải viết lại chỉ vì tôi đột nhiên gỡ lỗi rằng không có cái gọi là kết hợp không tham lam trong awk / gawk, do đó nó không thể thực thi đúng một số regex.


0

Nó phụ thuộc vào đồng đội của bạn và bạn lãnh đạo và nhiệm vụ bạn đang thực hiện.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}

0

Tôi đã thực hiện một số mã hóa trong python hiện tại. Nhưng tôi vẫn không biết nó đủ tốt để sử dụng dễ dàng cho các chuyển đổi tệp đơn giản.

Với awk, tôi có thể nhanh chóng phát triển một đoạn mã một dòng trên dòng lệnh unix thực hiện một số biến đổi khá phức tạp. Mỗi khi tôi sử dụng awk, đoạn mã tôi viết sẽ chỉ dùng một lần và dài không quá vài dòng. Có thể một trạng thái "if" và "printf" ở đây hoặc ở đó trên một dòng.

Tôi chưa bao giờ viết một đoạn mã dài hơn 10 dòng với awk. Tôi đã xem một số kịch bản như vậy nhiều năm trước.

Nhưng bất cứ thứ gì yêu cầu nhiều dòng mã, tôi sẽ sử dụng python.

Tôi yêu awk. Nó là một công cụ rất mạnh khi kết hợp với sed.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.