tra-loi-cau-hoi-phat-trien-web.com

Sự khác biệt giữa sed và awk là gì?

  • Sự khác biệt giữa awk và sed là gì?
  • Những 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?
464
Rachel

sedlà một trình chỉnh sửa luồng. Nó hoạt động với các luồ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 lặp kiểu goto và các điều kiện đơn giản (ngoài việc khớp mẫu và khớp địa chỉ). Về cơ bản chỉ có hai "biến": không gian mẫu và không gian giữ. Khả năng đọc các kịch bản có thể khó khăn. Các hoạt động toán học là cực kỳ lúng túng ở tốt nhất.

Có nhiều phiên bản khác nhau của sedvớ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ó các cấu trúc lập trình mạnh mẽ hơn nhiều bao gồm ifname __/elsename__, whilename__, doname __/whileforCó sự hỗ trợ đầy đủ cho các biến và các mảng kết hợp một chiều cộng với các mảng đa chiều (IMO). Các phép toán tương tự như các phép toán trong C. Nó có printfvà các hàm. Chữ "K" trong "AWK" là viết tắt của "K ernighan" như trong "Kernighan và Ritchie" của cuốn sách "Ngôn ngữ lập trình C" (không quên A ho và W einberger). Người ta có thể hình dung viết một máy phát hiện đạo văn học thuật bằng cách sử dụng awkname__.

GNU awk(gawkname__) có nhiều phần mở rộng, bao gồm các mảng đa chiều thực sự trong phiên bản mới nhất. Có các biến thể khác của awkbao gồm mawknawkname__.

Cả hai chương trình đều sử dụng biểu thức chính quy để chọn và xử lý văn bản.

Tôi có xu hướng sử dụng sedtrong đó 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 ở dạng "dấu trừ theo sau là một chuỗi các chữ số" (ví dụ: "-231,45") bằng mẫu "ngoặc của kế toán viên" (ví dụ "(231,45)" ) bằng cách sử dụng cái này (có chỗ để cải thiện):

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

Tôi sẽ sử dụng awkkhi văn bản trông giống các hàng và cột hơn hoặc, như awkđề cập đến chúng "bản ghi" và "trường". Nếu tôi định thực hiện một thao tác tương tự như trên, nhưng chỉ trên trường thứ ba trong một tệp được phân cách bằng dấu phẩy đơn giản, tôi có thể làm một cái 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 không minh họa đầy đủ các khả năng mà mỗi khả năng phải cung cấp.

518
Dennis Williamson

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

Cả hai đều là công cụ biến đổi văn bản. NHƯNG awk có thể làm nhiều việc hơn ngoài việc thao túng văn bản. Bản thân nó là ngôn ngữ lập trình với hầu hết những điều bạn học trong lập trình, như mảng, vòng lặp, điều khiển luồng if/other, v.v. .

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 văn bản rất đơn giản. Bất cứ điều gì ngoài điều đó, awk là tốt hơn. Trong thực tế, bạn có thể bỏ sed hoàn toàn và chỉ cần sử dụng awk. Vì các chức năng của chúng chồng chéo và awk có thể làm nhiều hơn, chỉ cần sử dụng awk. Bạn sẽ giảm thời gian học tập của bạn là tốt.

116
ghostdog74

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

Đối với tôi, quy tắc để phân tách 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 soạn thảo văn bản theo cách thủ công. Đó là lý do tại sao nó được gọi là stream biên tập viên. (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à các trường đếm, tính tổng, trích xuất và sắp xếp lại các cấu trúc, v.v.

Ngoài ra, bạn không nên quên về 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 văn bản (tệp)

43
hek2mgl