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?
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:
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 |).
Đâ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.
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 tail
là bao lâu , +n -2
sẽ bỏ qua dòng đầu tiên.
grep
sẽ đệ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-buffered
tù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.)