Mọi người chơi Linux đều cần biết Sed và Awk. Đây là lý do tại sao…
Hai trong số các tiện ích Linux bị đánh giá thấp nhất là sed và awk. Mặc dù chúng có vẻ hơi phức tạp, nhưng nếu bạn phải thực hiện các thay đổi lặp đi lặp lại đối với các đoạn mã hoặc văn bản lớn hoặc nếu bạn phải phân tích một số văn bản, thì sed và awk là vô giá.
Vậy, chúng là gì? Chúng được sử dụng như thế nào? Và làm thế nào, khi được kết hợp, chúng giúp xử lý văn bản dễ dàng hơn?
Mục Lục
Sed là gì?
sed được phát triển vào năm 1971 tại Bell Labs, bởi nhà tiên phong máy tính huyền thoại Lee E. McMahon.
Tên là viết tắt của “trình chỉnh sửa luồng”. sed cho phép bạn chỉnh sửa nội dung hoặc luồng văn bản theo lập trình, thông qua một ngôn ngữ lập trình Turing hoàn chỉnh và nhỏ gọn và đơn giản.
Cách hoạt động của sed rất đơn giản: nó đọc từng dòng văn bản vào một bộ đệm. Đối với mỗi dòng, nó sẽ thực hiện các hướng dẫn được xác định trước, nếu có.
Ví dụ: nếu ai đó đã viết một đoạn script sed thay thế từ “beer” bằng “soda”, rồi chuyển vào một tệp văn bản chứa toàn bộ lời bài hát cho “99 Chai bia trên tường”, nó sẽ được chuyển tệp đó trên cơ sở từng dòng và in ra “99 Chai Soda treo tường”, v.v.
Tập lệnh sed cơ bản nhất là “Hello World”. Ở đây, chúng tôi sử dụng tiếng vang lệnh, chỉ xuất ra các chuỗi, để in “Hello World”. Nhưng chúng tôi đặt điều này thành sed và yêu cầu nó thay thế “World” bằng “Dave”. Công cụ tự giải thích.
echo "Hello World" | sed s/World/Dave/
Bạn cũng có thể kết hợp hướng dẫn sed vào tệp nếu bạn cần thực hiện một số chỉnh sửa phức tạp hơn. Lấy cảm hứng từ chủ đề Reddit vui nhộn này, hãy lấy lời bài hát cho “Take On Me” của A-ha và thay thế từng bản sao của “I”, “Me” và “My”, bằng Greg.
Đầu tiên, đặt lời bài hát vào một tệp văn bản có tên tom.txt. Sau đó, mở trình soạn thảo văn bản ưa thích của bạn và thêm các dòng sau. Đảm bảo tệp bạn tạo kết thúc bằng .sed.
s/I/Greg/
s/Me/Greg/
s/me/Greg/
s/My/Greg/
s/my/Greg/
Bạn có thể nhận thấy sự lặp lại trong ví dụ trên (chẳng hạn như s / me / Greg / và s / Me / Greg /). Đó là bởi vì một số phiên bản của sed, như phiên bản đi kèm với macOS, không hỗ trợ đối sánh không phân biệt chữ hoa chữ thường. Do đó, chúng tôi phải viết hai hướng dẫn cho mỗi từ để sed nhận ra phiên bản viết hoa và không viết hoa.
Điều này sẽ không hoạt động hoàn hảo, như thể bạn đã thay thế từng trường hợp của “Tôi”, “Tôi” và “Của tôi” bằng tay. Hãy nhớ rằng, chúng tôi chỉ sử dụng điều này như một bài tập để chứng minh cách bạn có thể nhóm các hướng dẫn sed vào một tập lệnh và sau đó thực thi chúng bằng một lệnh duy nhất.
Sau đó, chúng ta cần gọi tệp. Để làm điều đó, hãy chạy lệnh này.
cat tom.txt | sed -f greg.sed
Hãy chạy chậm lại và xem điều này có tác dụng gì. Bạn có thể nhận thấy rằng chúng tôi không sử dụng tiếng vọng ở đây. Chúng tôi đang sử dụng mèo. Đó là bởi vì trong khi cat sẽ in ra toàn bộ nội dung của tệp, thì echo sẽ chỉ in ra tên tệp. Bạn cũng có thể nhận thấy rằng chúng tôi đang chạy sed với cờ “-f”. Điều này yêu cầu nó mở tập lệnh dưới dạng tệp.
Kết quả cuối cùng là:
Cũng cần lưu ý rằng sed hỗ trợ biểu thức chính quy (REGEX). Chúng cho phép bạn xác định các mẫu trong văn bản, sử dụng một cú pháp đặc biệt và phức tạp.
Đây là một ví dụ về cách nó có thể hoạt động. Chúng tôi sẽ lấy lời bài hát nói trên, nhưng sử dụng regex để in ra mọi dòng không bắt đầu bằng “Take”.
cat tom.txt | sed /^Take/d
Tất nhiên, sed cực kỳ hữu ích. Nhưng nó thậm chí còn mạnh hơn khi kết hợp với awk.
AWK là gì?
AWK, giống như sed, là một ngôn ngữ lập trình xử lý các phần lớn văn bản. Nhưng trong khi mọi người sử dụng sed để xử lý và sửa đổi văn bản, mọi người chủ yếu sử dụng AWK như một công cụ để phân tích và báo cáo.
Giống như sed, AWK lần đầu tiên được phát triển tại Bell Labs vào những năm 1970. Tên của nó không xuất phát từ những gì chương trình thực hiện, mà là họ của từng tác giả: Alfred Aho, Peter Weinberger và Brian Kernighan. Nói chung, AWK đề cập đến chính ngôn ngữ lập trình. Ở dạng chữ thường, awk đề cập đến công cụ dòng lệnh.
AWK hoạt động bằng cách đọc một tệp văn bản hoặc luồng đầu vào một dòng tại một thời điểm. Mỗi dòng được quét để xem nó có khớp với một mẫu được xác định trước hay không. Nếu tìm thấy một kết quả phù hợp, một hành động sẽ được thực hiện.
Nhưng mặc dù sed và AWK có thể chia sẻ các mục đích tương tự, chúng là hai ngôn ngữ hoàn toàn khác nhau, với hai triết lý thiết kế hoàn toàn khác nhau. AWK gần giống với một số ngôn ngữ có mục đích chung, như C, Python và Bash. Nó có những thứ như hàm và cách tiếp cận giống C hơn đối với những thứ như lặp và biến. Nói một cách đơn giản, AWK giống như một ngôn ngữ lập trình hơn.
Vì vậy, chúng ta hãy thử nó ra. Sử dụng lời bài hát của “Take On Me”, chúng tôi sẽ in tất cả các dòng dài hơn 20 ký tự.
awk ' length($0) > 20 ' tom.txt
Kết hợp cả hai
awk và sed đều cực kỳ mạnh mẽ khi kết hợp. Bạn có thể làm điều này bằng cách sử dụng Unix pipe. Đó là dấu “|” các bit giữa các lệnh.
Hãy thử điều này: chúng tôi sẽ liệt kê tất cả các dòng trong “Take On Me” có hơn 20 ký tự, sử dụng awk. Sau đó, chúng ta sẽ loại bỏ tất cả các dòng bắt đầu bằng “Take”. Cùng nhau, tất cả trông như thế này:
awk 'length($0)>20' tom.txt | sed /^Take/d
Và tạo ra cái này:
Sức mạnh của sed và awk
Chỉ có rất nhiều điều bạn có thể giải thích trong một bài viết, nhưng hy vọng, bây giờ bạn có thể cảm nhận được sức mạnh của sed và awk. Nói một cách đơn giản, chúng là một cường quốc xử lý văn bản.
Vậy tại sao bạn nên quan tâm? Chà, ngoài thực tế là bạn không bao giờ biết khi nào bạn cần thực hiện các thay đổi lặp đi lặp lại có thể đoán trước được đối với tài liệu văn bản, sed và awk là lựa chọn tuyệt vời để phân tích cú pháp tệp nhật ký. Điều này đặc biệt hữu ích khi bạn đang cố gắng gỡ lỗi sự cố trong máy chủ LAMP của mình hoặc xem nhật ký truy cập của bạn để xem liệu máy chủ của bạn có bị tấn công hay không.
Đọc tiếp
Thông tin về các Tác giả