Sự khác biệt giữa sed và awk là gì? [đóng cửa]


497
  • 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?

2
Một QA liên quan trên unix.stackexchange: Có hướng dẫn cơ bản cho grep, awk và sed không?
Dani

Câu trả lời:


549

sedlà một biên tập viên dò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 phép toán học cực kỳ khó xử.

Có nhiều phiên bản khác nhau 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 phân định trên cơ sở mỗi dòng. Nó có mạnh mẽ nhiều hơn nữa cấu trúc lập trình bao gồm if/ else, while, do/ whilefor(C-phong cách và mảng lặp lại). Có sự hỗ trợ đầy đủ cho các biến và mảng kết hợp một chiều cộng với mảng đa chiều (IMO). Các phép toán tương tự như trong C. Nó có printfvà 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" nổi tiếng (đừ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.

GNU awk( gawk) 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 awkbao gồm mawknawk.

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 sẽ có xu hướng sử dụng sednơ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 ở dạng "dấu trừ theo sau là một chuỗi các chữ số" (ví dụ: "-231,45") bằng biểu mẫu "dấu ngoặc kế toán" (ví dụ "(231,45)" ) 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 như các hàng và cột 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.


7
Để xem một số ví dụ về việc đẩy ranh giới của sed: sed.sourceforge.net/#scripts
Tạm dừng cho đến khi có thông báo mới.

@DennisWilliamson - Tôi có bất lợi nếu tôi chỉ học awk không? Là awk thường được sử dụng nhiều hơn so với sed?
Hơi nước

4
@blasto: Đề nghị của tôi là học cả hai nhưng chú trọng hơn vào awk. Rất nhiều công cụ biểu thức chính quy áp dụng cho cả (và các công cụ và ngôn ngữ khác). Sử dụng sed cho những thứ đơn giản hơn và cố gắng tránh những thứ phức tạp. Thật tuyệt khi bạn có thể thực hiện các vòng lặp và các nhánh trong sed, nhưng các dòng lệnh kết quả rất phức tạp và khó đọc. Câu trả lời cho câu hỏi của bạn thực sự phụ thuộc vào những gì bạn đang làm.
Tạm dừng cho đến khi có thông báo mới.

@DennisWilliamson - Điều gì sẽ hữu ích nhất cho nhà phát triển ETL? ETL hoặc Extract Transform and Load là một thuật ngữ lưu trữ dữ liệu. Nói một cách chính xác, công việc liên quan đến EXTRACTION dữ liệu từ các nguồn khác nhau khác nhau (chẳng hạn như DB, tệp excel, tệp csv, v.v.), CHUYỂN ĐỔI cùng và sau đó LOADING vào một kho dữ liệu (DW) để phân tích, tìm mẫu trong dữ liệu hoặc chỉ là lịch sử Hồ sơ. ví dụ. Việc sử dụng cuối DW - Thuật toán áp dụng cho DW của cửa hàng tạp hóa có dữ liệu từ 10 năm qua có thể tiết lộ rằng những người có xu hướng mua táo cũng mua cam hoặc một thứ tương tự.
Hơi nước

1
Chỉ là một FYI cho bất kỳ ai tình cờ phát hiện ra điều này trên máy mac, hãy thử "sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'" cho ví dụ sed đầu tiên
Daniel Schmidt

124

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 được trong lập trình, như mảng, vòng lặp, điều khiển luồng nếu / khác, v.v. 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 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.


7
Điểm hay về đường cong học tập .. quá nhiều công cụ có thể trộn lẫn .. vì vậy tôi chỉ thích học grep và awk thôi .. hãy quên đi sed :)
Ngoại

174
^^ Đủ rồi. (xin lỗi, tôi đã phải)
Greg M. Krsak

8
Tôi thấy sed dễ học hơn nhiều, vì vậy bạn cần tính đến điều đó. Khi bạn học cách thành thạo awk, có thể hữu ích khi nhanh chóng học sed để có thể sử dụng nó nhanh hơn cho những việc bạn có thể chưa biết cách làm trong awk.
Didier A.

1
@GregKrsak bạn đã làm cho ngày của tôi. (xin lỗi, tôi đã phải)
Abel Callejo

15
Đừng bỏ qua sed, 's/search/replace'cách gõ dễ dàng hơn awkcú pháp và là thứ bạn cần hầu hết thời gian.
sjas

54

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à trình chỉnh sửa 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 awknế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 grepnếu bạn chỉ muốn tìm kiếm / trích xuất một cái gì đó trong một văn bản (tập tin)

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.