2009-10-27 42 views
389
  • Sự khác biệt giữa awk và sed là gì?
  • Loại ứng dụng nào là sử dụng tốt nhất trường hợp cho các dụng cụ an toàn và lúng túng?
+1

QA liên quan trên unix.stackexchange: [Có hướng dẫn cơ bản về grep, awk và sed không?] (Http: //unix.stackexchange .com/2434/là-có-một-cơ bản-hướng dẫn-cho-grep-awk-và-sed) – Dani

Trả lời

438

sed là trình chỉnh sửa luồng. Nó hoạt động với các dòng ký tự trên cơ sở mỗi dòng. Nó có một ngôn ngữ lập trình nguyên thủy bao gồm các vòng kiểu goto và các điều kiện đơn giản (ngoài kết hợp mẫu và đối sánh địa chỉ). Về cơ bản, chỉ có hai "biến": không gian mẫu và không gian lưu trữ. Khả năng đọc các tập lệnh có thể khó khăn. Các hoạt động toán học cực kì khó xử ở mức tốt nhất.

Có nhiều phiên bản khác nhau của sed với các mức hỗ trợ khác nhau cho các tùy chọn dòng lệnh và các tính năng ngôn ngữ.

awk được định hướng theo các trường được phân tách trên cơ sở mỗi dòng. Nó có nhiều cấu trúc lập trình mạnh mẽ hơn bao gồm if/else, while, do/whilefor (lặp lại kiểu C và mảng). Có hỗ trợ đầy đủ cho các biến và mảng kết hợp đơn chiều cộng với (IMO) mảng đa chiều kludgey. Các hoạt động toán học tương tự như trong C. Nó có printf và các hàm. Chữ "K" trong "AWK" là viết tắt của "K ernighan" như trong "Kernighan and Ritchie" của cuốn sách "Ngôn ngữ lập trình C" nổi tiếng (không được quên A ho và W einberger). Người ta có thể hình dung ra một máy dò đạo văn học sử dụng awk.

GNU awk (gawk) có nhiều tiện ích, bao gồm mảng đa chiều thực trong phiên bản mới nhất. Có các biến thể khác của awk bao gồm mawknawk.

Cả hai chương trình đều sử dụng cụm từ thông dụng để chọn và xử lý văn bản.

Tôi có xu hướng sử dụng sed nơi có các mẫu trong văn bản. Ví dụ: bạn có thể thay thế tất cả các số âm trong một số văn bản có dạng "dấu trừ được theo sau bởi một chuỗi chữ số" (ví dụ: "-231.45") với biểu mẫu "dấu ngoặc đơn kế toán" (ví dụ: "(231.45) ") sử dụng này (trong đó có chỗ cho cải tiến):

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile 

Tôi sẽ sử dụng awk khi văn bản trông giống như các hàng và cột hoặc, như awk đề cập đến họ 'hồ sơ' và 'lĩnh vực' Nếu. tôi đã đi để làm một hoạt động tương tự như trên, nhưng chỉ trên lĩnh vực thứ ba trong một dấu phẩy tập tin được phân định đơn giản, tôi có thể làm điều gì đó như:

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile 

Tất nhiên đó chỉ là những ví dụ rất đơn giản mà không minh họa đầy đủ các khả năng mà mỗi công ty cung cấp.

+3

Cảm ơn Dennis vì lời giải thích nhanh chóng. – Rachel

+3

Để xem một số ví dụ về việc đẩy ranh giới của 'sed': http://sed.sourceforge.net/#scripts –

+3

Cảm ơn bạn Dennis đã cung cấp liên kết đến các ví dụ sed – Rachel

94

1) Sự khác nhau giữa awk và sed là gì?

Cả hai đều là công cụ biến đổi văn bản. NHƯNG có thể làm nhiều việc hơn ngoài việc thao tác văn bản. Một ngôn ngữ lập trình của chính nó với hầu hết những thứ bạn học trong lập trình, như mảng, vòng lặp, if/else control control etc Bạn cũng có thể "lập trình" trong sed, nhưng bạn sẽ không muốn duy trì mã được viết trong đó .

2) Loại ứng dụng nào là trường hợp sử dụng tốt nhất cho các công cụ sed và awk?

Kết luận: Sử dụng sed để phân tích cú pháp văn bản rất đơn giản. Bất cứ điều gì ngoài đó, awk là tốt hơn. Trong thực tế, bạn có thể ditch sed hoàn toàn và chỉ sử dụng awk. Vì các chức năng của chúng chồng chéo lên nhau và awk có thể làm nhiều hơn, chỉ cần sử dụng awk. Bạn cũng sẽ giảm đường cong học tập của mình.

+5

Điểm tốt đẹp về đường cong học tập .. quá nhiều công cụ có thể mixup .. vì vậy tôi muốn học grep và chỉ lúng túng .. cho phép quên đi sed :) – Outlier

+104

^^ Đủ sed. (xin lỗi, tôi đã phải) –

+3

Tôi thấy sed là dễ dàng hơn nhiều để tìm hiểu mặc dù, vì vậy bạn cần phải tài khoản cho điều đó. Khi bạn tìm hiểu để làm chủ awk, nó có thể hữu ích để nhanh chóng tìm hiểu sed để có thể sử dụng nó nhanh hơn cho những điều bạn có thể không biết làm thế nào để làm trong awk được nêu ra. –

30

Cả hai công cụ đều có ý nghĩa để làm việc với văn bản và có nhiệm vụ cả hai công cụ có thể được sử dụng cho.

Đối với tôi quy tắc tách riêng chúng là: Sử dụng sed để tự động hóa các tác vụ bạn sẽ làm khác trong trình chỉnh sửa văn bản theo cách thủ công. Đó là lý do tại sao nó được gọi là trình soạn thảo luồng . (Bạn có thể sử dụng các lệnh tương tự để chỉnh sửa văn bản trong vim). Sử dụng awk nếu bạn muốn phân tích văn bản, nghĩa là đếm trường, tính tổng, trích xuất và sắp xếp lại cấu trúc, v.v.

Ngoài ra, bạn không nên quên khoảng grep. Sử dụng grep nếu bạn chỉ muốn tìm kiếm/trích xuất nội dung nào đó trong một văn bản (tệp)

Các vấn đề liên quan