Khi nào nên sử dụng grep, less, awk, sed [shut]


17

Tôi đang bước vào thế giới của Linux và tại nơi làm việc Tôi đang sử dụng grepngày càng nhiều. Bằng cách đó, tôi nhận ra rằng đôi khi nó không đủ cho những gì tôi muốn.

Tôi đã vật lộn với grepmột vài ngày trước và một đồng nghiệp của tôi là một quản trị viên Linux cao cấp, đã bảo tôi sử dụng awk. Tôi choáng váng vì tôi nhận được kết quả nhanh như thế nào.

Vì vậy, câu hỏi của tôi là khi nào bạn chọn sử dụng cái này hơn cái kia? Những câu hỏi nào tôi có thể tự hỏi mình trước khi đi làm grepvà dành nhiều thời gian, khi tôi có thể thực hiện nó awkvà tiết kiệm thời gian?


Đây là một câu hỏi hay nhưng nó thực sự rất rộng và chủ yếu dựa trên ý kiến. Để trả lời câu hỏi của bạn, sử dụng grep trái ngược với awk thực sự phụ thuộc vào mức độ thoải mái của bạn khi sử dụng awk / sed. Có một vài lý do tại sao người ta sẽ sử dụng điều này sau đó như tìm kiếm một cái gì đó cụ thể hơn những gì grep phải cung cấp hoặc nếu bạn đang cố gắng thay thế / chỉnh sửa các tệp bằng một chuỗi cụ thể (sử dụng sed). Nhưng một lần nữa, tất cả phụ thuộc vào mức độ thoải mái và kinh nghiệm của bạn với việc sử dụng awk / sed.
ryekayo

7
Sử dụng lessđể xem một tập tin. Sử dụng grepđể tìm kiếm thông qua một tập tin. Sử dụng sedđể chỉnh sửa một tập tin. Sử dụng awkhơn grepsedkhi tệp bạn muốn xử lý có một số loại cấu trúc (chẳng hạn như cột). Sử dụng sedhơn awkkhi bạn chủ yếu muốn xử lý các dòng (chẳng hạn như xóa hoặc thêm dòng văn bản). Tôi chắc rằng ai đó sẽ viết một câu trả lời dài 20 trang đầy đủ hơn của tôi.
Satō Katsura

Xin chào Sato, Nó không phải là về chiều dài, nhưng những gì được nói. Và bạn vài dòng rất nhiều thông tin. Cảm ơn bạn.
frankguthrie

Câu trả lời:


25

sedawklà supersets của grep, có những điều dễ dàng hơn để làm với cái này hay cái khác.

grep foocó thể được viết sed '/foo/!d'hoặc awk /foo/, nhưng xem xét:

grep -i foosẽ phải là sed '/[fF][oO][oO]/!d'trừ khi bạn muốn xem xét các phần mở rộng không chuẩn như GNU sed '/foo/I!d'. Hoặc với awk: awk 'tolower($0) ~ /foo/'hoặc một lần nữa sử dụng phần mở rộng GNU : awk -v IGNORECASE=1 /foo/.

Những công cụ khác nhau rất tốt và cồng kềnh với các công cụ khác:

grep

greplà một công cụ đơn giản nhưng có các chế độ hoạt động rất chuyên dụng khó tái tạo bằng awkhoặc sed:

  • grep -i đối với trường hợp khớp không nhạy cảm (xem ở trên)
  • grep -Fe "$string"cho tìm kiếm chuỗi cố định ( export string; awk 'index($0, ENVIRON["string"])'với awk, không có tương đương trực tiếp với sed).
  • (không chuẩn) grep -rcho tìm kiếm đệ quy
  • (không chuẩn) grep -P/ pcregrepcho regexps giống như perl (một số sedtriển khai có hỗ trợ regex giống như perl mặc dù không phải là chính nhất)
  • (không chuẩn) grep -ođể trả về phần khớp (một số dòng awkhoặc sedlàm tương tự)
  • (không chuẩn) grep -A/B/Cđể trả về bối cảnh xung quanh trận đấu (một lần nữa đau đớn phải làm theo cách tương tự với sedhoặc awk)

quyến rũ

  • s/foo/bar/: sed'S slệnh có nhiều tính năng mà khó thực hiện trong awknhư:
  • s/foo\(.*\)bar/\1/g: chụp (mặc dù GNU awk có gensub()phần mở rộng cho điều đó)
  • s/foo/bar/3: thay thế lần xuất hiện thứ 3 trên mỗi dòng
  • (không chuẩn): chỉnh sửa tệp tại chỗ (mặc dù hiện tại nó cũng được GNU hỗ trợ awk).

ôi

awk là tính năng phong phú nhất trong ba.

  • tốt cho việc xử lý số
  • tốt để xử lý đầu vào được định dạng trong các cột.
  • tốt để trích xuất và kết hợp dữ liệu từ các nguồn khác nhau, với các mảng kết hợp của nó.

perl

perlnhư một công cụ báo cáo và trích xuất thực tế có những công cụ tốt nhất. Đó là những gì nó được thiết kế ban đầu (là công cụ làm cho tất cả những thứ đó sed/ awklỗi thời).

Nắm vững perlđể làm xử lý văn bản không cung cấp một lợi thế nghiêm trọng. Tôi khuyên bạn nên dành một chút thời gian cho nó, thậm chí trước khi xem các sedlệnh ít phổ biến hơn .

hiệu suất

Theo nguyên tắc thông thường, công cụ càng chuyên dụng, hiệu quả nhất trong công việc. Nhưng điều đó cũng phụ thuộc rất nhiều vào việc thực hiện, nhiệm vụ và một vài yếu tố và hiệu suất khác có thể có sự đánh đổi có thể cần phải tính đến.

Ví dụ, có một số grephoặc sedtriển khai rất nhanh, nhưng chẳng hạn, chúng không hỗ trợ các ký tự đa nhân nên chỉ có thể hoạt động chính xác trên văn bản US-English ở các địa phương nhiều byte. Hoặc chúng nhanh vì chúng hoạt động trên một bộ đệm có độ dài cố định nhỏ và do đó không thể hoạt động trên đầu vào tùy ý ...


Câu trả lời tuyệt vời! Bạn có biết về hiệu quả của các công cụ? Tôi bối rối về tuyên bố của OP, đó awklà nhanh hơn nhiều grep.
pfnuesel

@pfnuesel, điều đó phụ thuộc rất nhiều vào việc triển khai và vào mô hình sử dụng. Chẳng hạn, mawkđược biết là rất hiệu quả (nhưng không hỗ trợ các ký tự đa nhân, đó là một phần lý do nó hiệu quả hơn một số công cụ khác)
Stéphane Chazelas
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.