Có thể lọc đầu ra của đuôi?


11

Tôi muốn theo đuôi một tệp nhưng chỉ xuất ra các dòng có một chuỗi nhất định trong đó. Điều này có thể không?

Câu trả lời:


32

sử dụng grep. Nó được xây dựng chỉ cho mục đích đó.

Để tìm các dòng từ đuôi / var / log / syslog có "cron" trong đó, chỉ cần chạy:

tail -f /var/log/syslog | grep cron

Và vì nó chấp nhận mọi thứ trên stdin, bạn cũng có thể sử dụng nó trên đầu ra của bất kỳ lệnh nào khác, bằng cách đặt đường ống theo cách tương tự như trên (sử dụng ký hiệu |).


8
Mặc dù điều này về cơ bản là đúng, nhưng điều quan trọng là phải nhận ra rằng grepsẽ đệm khi nó được sử dụng không tương tác, chẳng hạn như khi nó là một phần của đường ống dài hơn. GNU grep 2.5.1 cung cấp --line-bufferedtùy chọn để khắc phục điều này khi loại bỏ grep khỏi đường ống không phải là một tùy chọn. (Khi tôi nói grep sẽ đệm, ý tôi là bạn sẽ không thấy đầu ra cho đến khi bộ đệm đạt mức tương đương 4k.)
kojiro

Để bổ sung nhận xét trước đó, "tail -f" trong Linux hiện đại sẽ hoạt động theo vòng lặp, chờ thêm đầu vào trong tệp syslog. Để có lệnh thực sự kết thúc với nội dung tồn tại của tệp, hãy bỏ qua công tắc -f: tail / var / log / syslog | grep cron
Gnudiff

7
tail -f /var/log/messages | grep "myfilterword"

Mong rằng sẽ giúp.


4

Đây là một vài ý tưởng khác, trong khi không đơn giản, có thể cung cấp một số tính linh hoạt bổ sung thú vị:

Đầu tiên, bạn có thể lọc bằng awk thay vì grep:

tail -f /var/log/messages | awk '/myfilterword/'

hoạt động chính xác giống như ví dụ sử dụng grep. Bạn có thể mở rộng điều này bằng cách sử dụng sức mạnh của awk, ví dụ:

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'

sẽ in lần thứ 6 đến trường cuối cùng của đầu ra (các trường được phân tách khoảng trắng)

Một ý tưởng tương tự khác là sử dụng perl one-liner:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

hoạt động chính xác như thế grep. Có lẽ bạn muốn một bộ đếm số dòng và chỉ trường thứ 6? Còn cái này thì sao:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

Rõ ràng tất cả những thứ này cũng có thể được thực hiện bằng các công cụ khác, nhưng tôi muốn minh họa rằng có một số cách thú vị để sử dụng các ngôn ngữ có mục đích chung hơn như awk hoặc perl ở đây.


+1 công phu lớn về cách mở rộng hơn grep!
pablo

2

Một mẹo đáng chú ý khác, nếu bạn có tệp CSV có tiêu đề mà bạn muốn bỏ qua, ví dụ:

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

Không quan trọng đầu vào taillà bao lâu , +n -2sẽ bỏ qua dòng đầu tiên.

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.