Các lựa chọn thay thế cho 'egrep -o thành công | lỗi | fail' <tên tệp> | sắp xếp | uniq -c '


8

Đôi khi tôi cần kiểm tra một số nhật ký và tôi làm điều này với lệnh này:

egrep -o "success|error|fail" <filename> | sort | uniq -c

Đầu vào mẫu:

test error on line 10
test connect success
test insert success
test started at 00:00
test delete  fail

Đầu ra mẫu:

1 error
1 fail
2 success

Tôi muốn biết nếu ai đó biết một cách để làm điều này với một lệnh ngắn hơn?

Trước khi bạn hỏi tại sao tôi muốn làm điều này với một lệnh khác ... Không có lý do đặc biệt, tôi chỉ tò mò :)

Câu trả lời:


4

Đây là awkcách làm

awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc

Nhưng tất cả những lớp lót này sẽ dài hơn một chút so với cái cũ tốt của chúng ta grep


4

Không, tôi nghĩ rằng bạn là tốt như nó được. Đương nhiên, bạn có thể làm điều đó với một tập lệnh perl,

perl -nle  's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END {  print "$_ $a{$_}" for keys %a } ' test.txt

... nhưng nó phức tạp hơn và ít trực quan hơn.


Tôi đã thêm một đầu vào mẫu cho câu hỏi của mình ... Hy vọng rằng bây giờ rõ ràng hơn những gì lệnh làm ... sory cho sự bất tiện
Wolfy

1
OK, tôi đã sửa đổi perliner cho phù hợp. Tôi vẫn nghĩ rằng giải pháp của bạn với egrep là tốt hơn và trực quan hơn.
Ngày

2

Không ngắn hơn nhiều, nhưng vì bạn không thực sự cần biểu thức chính quy, nên có fgrep( grep -F).

fgrep 'success
error
fail' "$filename" | sort | uniq -c

một cách khác để viết điều tương tự trong bash:

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c

1

Bạn có thể viết một tập lệnh bash đơn giản và sau đó gọi tập lệnh, như:

#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c

và lưu nó dưới dạng (ví dụ) myscript.sh. Sau đó làm một chmod +x myscript.shvà bạn có thể gọi nó như thế nào myscript.sh <filename>.


Nhưng trong trường hợp này, lệnh này giống nhau ... bạn vừa tạo một tập lệnh gọi lệnh ...
Wolfy

Tôi nghĩ bạn chỉ muốn tăng tốc độ ghi nhật ký của bạn. Chỉ tò mò, tại sao bạn muốn một lệnh thay thế nếu lệnh bạn đã cung cấp thực hiện công việc tốt cho bạn?
jeremija

như tôi đã nói: Tôi chỉ tò mò về cách người khác làm điều gì đó như thế ... nhiều lần tôi nhận ra rằng mọi người biết một số cách thú vị / tốt đẹp để làm mọi thứ và tôi yêu te tìm hiểu cách làm việc này ...
Wolfy

2
Trong trường hợp đó, bạn là người đó :-) Dòng lệnh của bạn rất hay, ngắn gọn, rõ ràng và khai thác sức mạnh của dòng lệnh Unix. Còn gì để ước?
Ngày

0

Lệnh của bạn, trong khi ngắn và ngọt ngào, là một cách khá mạch để đếm số lần xuất hiện của một thuật ngữ. Có lẽ tôi sẽ sử dụng cách tiếp cận trực tiếp và trực tiếp và sử dụng cờ -c của grep (chính xác là như vậy) bên trong một vòng lặp shell:

for i in success test fail; do echo `grep -c $i <filename>` $i; done

Không ngắn, không thú vị, có khả năng nhanh hơn đối với các logfile lớn (không sort). Tôi muốn nói rằng đó là một rửa.


-1

Đây có thể là một câu trả lời giả nhưng tôi nghĩ, trong trường hợp này, sortlà khá vô dụng; có lẽ bạn có thể bỏ qua nó. Tuy nhiên, ở đây chúng tôi đang sử dụng ba lệnh khác nhau cho ba hành động khác nhau.

Chúng ta có thể rút ngắn nếu một số trong số chúng có thể đạt được với một số tùy chọn grep, nhưng tôi không thấy cái nào ... :)


2
Không, không, nếu không, uniq sẽ chỉ tính các trường hợp tìm kiếm liên tiếp . Ví dụ: nếu bạn có thành công, thành công, thất bại, thành công, thì đầu ra của uniq sẽ là 2 success 1 fail 1 success.
Ngày

không sao đâu ... sry
Alessio Tomelleri
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.