sed
là 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 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ó các cấu trúc lập trình mạnh mẽ hơn nhiều bao gồm if
name __/else
name__, while
name__, do
name __/while
và for
Có 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ó printf
và 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 awk
name__.
GNU awk
(gawk
name__) 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 awk
bao gồm mawk
và nawk
name__.
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 sed
trong đó 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 awk
khi 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.
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.
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)