Hiển thị tên tệp khi bắt đầu mỗi dòng khi đuôi nhiều tệp cùng một lúc?


14

khi theo đuôi nhiều tệp cùng một lúc như hình dưới đây, có cách nào để hiển thị tên tệp ở đầu mỗi dòng không?

tail -f one.log two.log

sản lượng hiện tại

==> one.log <==
contents of one.log here...
contents of one.log here...

==> two.log <==
contents of one.log here...
contents of two.log here..

Tìm kiếm một cái gì đó như

one.log: contents of one.log here...
one.log: contents of one.log here...
two.log: contents of two.log here...
two.log: contents of two.log here...

Bạn có thể nhìn vào -vtùy chọn (dài dòng) cho đuôi. Điều này có thể không chính xác phù hợp với yêu cầu của bạn, nhưng là một sự khởi đầu.
rahul

Tôi nghĩ rằng đa nhiệm có thể làm điều này
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


7
tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\ cảm ơn {don_cristti}


@don_crissti, cảm ơn bạn! (1) một tập tin vs - không có thêm rượu vào ly của tôi! (2) ý kiến ​​hay. Tôi bắt đầu làm một cái gì đó như thế này nhưng tôi tự nhủ với bản thân mình "không ai sẽ tạo ra các tập tin có dấu cách" :) - Tôi sẽ sử dụng các đề xuất tuyệt vời của bạn.
JJoao

bạn có thể giải thích chiều dài-8? Tại sao nó là 8 ở đây, tôi chỉ biết 8 công trình.
Quách Shicheng

1
đuôi -n 1 * .txt | awk '/ ^ ==> / {a = đế ($ 0, 5, chiều dài-8); tiếp theo} {in a, $ 1} '| awk '$ 2> 0 {if ($ 2! ~ / chrY /) in $ 1}' | xargs -I {} qsub {}
Quách Shicheng

@ShichengGuo, 8 = length ("==>") + length ("<==")
JJoao

1
đáng ngạc nhiên / đáng ngạc nhiên awkgiải pháp ma thuật joojoo của bạn hoạt động!
Trevor Boyd Smith

6

Câu trả lời ngắn

GNU Parallel có một tập hợp các tùy chọn đẹp giúp thực hiện những việc đó thật dễ dàng:

parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log

Đầu ra sẽ là:

one.log: nội dung của one.log tại đây ...
one.log: nội dung của one.log tại đây ...
Two.log: nội dung của hai.log tại đây ...
Two.log: nội dung của hai.log tại đây ...

Giải thích thêm

  • Các --tagstring=strthẻ tùy chọn mỗi dòng đầu ra với chuỗi str . Từ parallel trang nam :
- chuỗi chuỗi
                Dòng thẻ với một chuỗi. Mỗi dòng đầu ra sẽ được thêm vào
                str và TAB (\ t). str có thể chứa các chuỗi thay thế, chẳng hạn như {}.

                --tagopes bị bỏ qua khi sử dụng -u, --onall và --nonall.
  • Tất cả các lần xuất hiện {}sẽ được thay thế bằng các đối số song song, trong trường hợp này là tên tệp nhật ký; tức là one.logtwo.log(tất cả các đối số sau :::).

  • Tùy chọn --line-bufferđược yêu cầu vì đầu ra của lệnh (ví dụ tail -f one.loghoặc tail -f two.log) sẽ được in nếu lệnh đó kết thúc. Vì tail -fsẽ chờ tăng trưởng tệp, nên bắt buộc phải in đầu ra trên cơ sở dòng --line-buffer. Một lần nữa từ parallel trang người đàn ông :

--line-đệm (thử nghiệm alpha)
                Đầu ra đệm trên cơ sở dòng. --group sẽ giữ đầu ra
                cùng nhau cho cả một công việc --ungroup cho phép đầu ra để trộn với
                một nửa dòng đến từ một công việc và một nửa dòng đến từ
                công việc khác. --line-buffer phù hợp giữa hai điều này: GNU song song
                sẽ in một dòng đầy đủ, nhưng sẽ cho phép trộn các dòng
                Công việc khác nhau.

2

Nếu tailkhông bắt buộc, bạn có thể sử dụng grepđể đạt được điều này:

grep "" *.log

Điều này sẽ in tên tệp là tiền tố của mỗi dòng đầu ra.

Ngắt đầu ra nếu *.logmở rộng thành chỉ một tập tin. Về vấn đề này:

grep '' /dev/null *.log

Tôi cần hiển thị tên tập tin trong đầu ra tail -fkhông grep.
mtk

@serenesat điều này sẽ chỉ in toàn bộ nội dung của các tập tin phải không? OP đã yêu cầu in tên tệp khi đuôi được chỉ định
rahul

bạn cũng có thể chỉ cần làm --with-filenamehoặc -Hluôn luôn bắt buộc nhập trước tên tệp.
Trevor Boyd Smith

tôi thực sự thích câu trả lời này thực hiện chính xác những gì cần thiết với một giải pháp dài 13 ký tự. trái ngược với awkgiải pháp khó khăn hoặc parallelkhông được cài đặt.
Trevor Boyd Smith

vấn đề duy nhất là nếu logfiles của bạn dài 1 triệu dòng. sau đó grep của bạn sẽ spam 1 triệu dòng vào bảng điều khiển (hoặc hơn ssh) ...
Trevor Boyd Smith

0

Ý tưởng của tôi sẽ là tạo một tệp duy nhất với các bản ghi được hợp nhất từ ​​một số tệp, giống như ai đó được đề xuất ở đây và thêm tên tệp:

$ tail -f /var/log/syslog | sed -u -E 's,(^.+$),/var/log/syslog: \1,g' >> /tmp/LOG &&
$ tail -f /var/log/Xorg.0.log | sed -u -E 's,(^.+$),/var/log/Xorg.0.log: \1,g' >> /tmp/LOG &&
$ tail -f /tmp/LOG

0

Một cái gì đó có xargssedcó thể làm việc:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
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.