Sử dụng grep vs awk


17

Để chụp một mẫu cụ thể, awkgrepcó thể được sử dụng. Tại sao chúng ta nên sử dụng cái này hơn cái kia? Cái nào nhanh hơn và tại sao?

Nếu tôi có một tệp nhật ký và tôi muốn lấy một mẫu nhất định, tôi có thể thực hiện một trong các cách sau

awk '/pattern/' /var/log/messages

hoặc là

grep 'pattern' /var/log/messages

Tôi chưa thực hiện bất kỳ điểm chuẩn nào, vì vậy tôi sẽ không biết. Ai đó có thể xây dựng điều này? Thật tuyệt khi biết hoạt động bên trong của hai công cụ này.


Đặt trước bất kỳ lệnh nào, thậm chí các tập lệnh shell, với timelệnh để tính thời gian cần thiết để chạy lệnh. Vd : time ls -l.
Bulrush

Câu trả lời:


26

grep rất có thể sẽ nhanh hơn:

# time awk '/USAGE/' imapd.log.1 | wc -l
73832

real    0m2.756s
user    0m2.740s
sys     0m0.020s

# time grep 'USAGE' imapd.log.1 | wc -l
73832

real    0m0.110s
user    0m0.100s
sys     0m0.030s

awk là một ngôn ngữ lập trình được giải thích, trong đó grep là một chương trình mã c được biên dịch (được tối ưu hóa thêm để tìm các mẫu trong các tệp).

(Lưu ý - Tôi đã chạy cả hai lệnh hai lần để bộ đệm không có khả năng làm sai lệch kết quả)

Thêm chi tiết về các ngôn ngữ được giải thích trên wikipedia.

Như Stephane đã chỉ ra một cách đúng đắn trong các bình luận, số dặm của bạn có thể thay đổi do việc triển khai grep và awk bạn sử dụng, hệ điều hành được bật và bộ ký tự bạn đang xử lý.


2
Không cần nói bạn đang sử dụng grep hay awk nào và trên kiến ​​trúc máy tính nào, và với bộ ký tự hệ thống nào, các thời gian đó có rất ít giá trị.
Stéphane Chazelas

1
lệnh thứ hai cũng sẽ sử dụng phiên bản mới được lưu trữ. Tôi không nghi ngờ rằng grep nhanh hơn nhưng không nhiều như số của bạn cho thấy.
exussum

(do đó chạy awk, grep, awk, grep và đăng kết quả từ bộ thứ hai của awk và grep :) và FYI, tôi sống ở một địa phương UTF8.
Drav Sloan

1
Hài hước lắm, với các công cụ BSD (trên máy Mac), awk (31,74 giây) nhanh hơn một chút so với sed (33,34 giây), nhanh hơn một chút so với grep (34,21 giây). Gnu awk sở hữu tất cả chúng ở 5.24s, tôi không có gnu grep hoặc sed để kiểm tra.
Kevin

1
grep nên nhanh hơn một chút vì awk làm nhiều hơn với mỗi dòng đầu vào thay vì chỉ tìm kiếm một biểu thức chính quy trong đó, ví dụ: nếu một trường được tham chiếu trong tập lệnh (trong trường hợp này không có trong trường hợp này) thì awk sẽ chia từng dòng đầu vào thành các trường dựa trên giá trị phân tách trường và nó điền vào các biến dựng sẵn. nhưng với những gì bạn đăng lên thì hầu như không có sự khác biệt. Cho đến nay, sự khác biệt quan trọng nhất giữa regexps của grep và awk wrt là grep tìm kiếm toàn bộ dòng cho một chuỗi khớp trong khi awk có thể tìm kiếm các trường cụ thể và do đó cung cấp độ chính xác cao hơn và ít khớp sai hơn.
Ed Morton

14

Sử dụng công cụ cụ thể và biểu cảm nhất. Công cụ phù hợp nhất với trường hợp sử dụng của bạn có khả năng là nhanh nhất.

Như một hướng dẫn sơ bộ:

  • tìm kiếm các dòng phù hợp với một chuỗi con hoặc regrec? Sử dụng grep.
  • chọn một số cột nhất định từ một tập tin được phân định đơn giản? Sử dụng cắt.
  • thực hiện thay thế dựa trên mô hình hoặc ... những thứ khác sed có thể hợp lý làm gì? Sử dụng sed.
  • cần một số kết hợp của 3 ở trên, hoặc định dạng printf, hoặc các vòng lặp và các mục đích chung? Sử dụng awk.

+1 ngoại trừ sử dụng perlthay vì awk. nếu bạn cần một cái gì đó phức tạp hơn grep / cut / sed, thì cơ hội sẽ không đủ và bạn cần một cái gì đó "toàn diện"
sds

@sds tại sao không trăn thay thế
RetroCode

@RetroCode: python là "mục đích chung" hơn perl; lớp lót tương đương có thể sẽ dài hơn nhiều.
sds

3
@sds không, bạn không cần perl trừ khi bạn sẽ làm gì đó ngoài xử lý văn bản. awk chỉ tốt cho các công cụ xử lý văn bản phức tạp hơn grep / cut / sed và như một phần thưởng theo tiêu chuẩn trên tất cả các cài đặt UNIX, không giống như perl.
Ed Morton

10

Khi chỉ tìm kiếm chuỗi và vấn đề tốc độ, bạn hầu như luôn luôn nên sử dụng grep. Đó là những đơn đặt hàng có cường độ nhanh hơn so với awkkhi chỉ tìm kiếm thô.

nguồn Sự khác biệt về chức năng và hiệu năng của sed, awk và các tiện ích phân tích cú pháp Unix khác

UTILITY    OPERATION TYPE      EXECUTION TIME     CHARACTERS PROCESSED PER SECOND
                               (10 ITERATIONS)
-------    --------------      ---------------    -------------------------------
grep       search only         41 sec.            489.3 million
sed        search & replace    4 min. 4 sec.      82.1 million
awk        search & replace    4 min. 46 sec.     69.8 million
Python     search & replace    4 min. 50 sec.     69.0 million
PHP        search & replace    15 min. 44 sec.    21.2 million

1
Cảm ơn cho tổng quan tốt đẹp của tất cả các chương trình này. Nó thực sự làm sáng tỏ trong bóng tối.
holasz

1
~ headtilt ~ PHP ở đó nhưng Perl thì không?
Izkata

@Izkata - Tôi đã nghĩ điều tương tự khi tôi nhìn thấy cái bàn này một lúc trước.
slm

1
Thật không công bằng với những tiện ích khác mà grep chỉ đang tìm kiếm và họ cũng đang thay thế.
Kevin

1
Đó là những con số hoàn toàn không có thật. Nói về việc so sánh táo và cam - giống như nói rằng bạn chỉ có thể tìm thấy một chiếc xe mới trên trang web A trong 5 giây trong khi bạn có thể tìm thấy một chiếc xe, thương lượng giá cả, vay tiền và mua xe trên trang web B trong 1 giờ do đó, trang A nhanh hơn trang web B. Bài báo bạn trích dẫn là hoàn toàn sai trong các tuyên bố về tốc độ thực thi tương đối giữa grep, sed và awk và nó cũng nói rằng awk ... has PCRE matching for regular expressionsđiều đó hoàn toàn sai sự thật.
Ed Morton

5

Mặc dù tôi đồng ý rằng trên lý thuyết grepnên nhanh hơn awk, trong thực tế, YMMV vì điều đó phụ thuộc rất nhiều vào việc triển khai bạn sử dụng.

ở đây so sánh grep và awk của busybox 1.20.0, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 trên Debian / Linux 7.0 amd64 (với glibc 2.17) trong ngôn ngữ UTF-8 trên tệp 240 MB của 2,5M dòng Ký tự chỉ ASCII.

$ time busybox grep error error | wc -l
331003
busybox grep error error  8.31s user 0.12s system 99% cpu 8.450 total
wc -l  0.07s user 0.11s system 2% cpu 8.448 total
$ time  busybox awk /error/ error | wc -l
331003
busybox awk /error/ error  2.39s user 0.84s system 98% cpu 3.265 total
wc -l  0.12s user 1.23s system 41% cpu 3.264 total
$ time  grep error error | wc -l
331003
grep error error  0.80s user 0.10s system 99% cpu 0.914 total
wc -l  0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error  0.54s user 0.13s system 91% cpu 0.732 total
wc -l  0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error  1.37s user 0.12s system 99% cpu 1.494 total
wc -l  0.04s user 0.07s system 7% cpu 1.492 total
$ time 

Trong miền địa phương C, chỉ GNU grep có được sự gia tăng đáng kể và trở nên nhanh hơn mawk.

Các tập dữ liệu, loại regrec cũng có thể tạo ra một sự khác biệt lớn. Đối với biểu thức chính, awknên được so sánh với biểu thức chính grep -Eawkbiểu thức mở rộng.

Đối với tập dữ liệu này, awkcó thể nhanh hơn greptrên các hệ thống hoặc hệ thống dựa trên busybox mawkmặc định awkvà ngôn ngữ mặc định là dựa trên UTF-8 (IIRC, nó từng là trường hợp trong Ubuntu).


2

Tóm lại, chỉ grepthực hiện một điều như nhiều công cụ UNIX khác và điều đó khớp với một dòng với mẫu đã cho và nó hoạt động tốt. Mặt khác, awklà công cụ tinh vi hơn vì nó là ngôn ngữ lập trình hoàn chỉnh được xác định theo tiêu chuẩn POSIX với các tính năng điển hình như biến, mảng, biểu thức, hàm hoặc câu lệnh điều khiển để quét và xử lý mẫu.

Theo tôi, nó phụ thuộc vào việc triển khai cả hai công cụ hoạt động như thế nào trong trường hợp khớp mẫu và vào kích thước của một số đầu vào bạn muốn xử lý. Tôi hy vọng rằng grep thường hiệu quả hơn awk vì nó chỉ phù hợp. Nhưng bạn không thể viết bằng grep một mã đơn giản để thực hiện các tác vụ phức tạp hơn như xử lý thêm các bản ghi khớp, tính toán hoặc in kết quả mà không cần sử dụng các công cụ khác.

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.