Lưu đầu ra của một grep vào một tệp có màu sắc


36

Tôi cần lưu kết quả của lệnh grep vào một tệp, nhưng tôi cũng muốn tệp đầu ra được định dạng và giữ các màu giống như trong thiết bị đầu cuối.

Có cách nào làm được việc này không? Có thể làm cho grep lưu vào một loại ngôn ngữ đánh dấu? Nếu không thể, có công cụ nào khác có thể hoàn thành nhiệm vụ này không?

Tôi đang cố gắng làm cho từ khóa tìm kiếm nổi bật trong tệp đầu ra, chính xác như nó làm trong thiết bị đầu cuối.

Câu trả lời:


43

Để giữ đánh dấu, bạn cần nhiều hơn là một tệp văn bản. Tôi sẽ sử dụng đầu ra HTML để giữ màu.

  • Cài đặt aha tức là "chuyển đổi các chuỗi thoát ANSI của thiết bị đầu cuối unix thành mã HTML "

    sudo apt-get install aha
  • sau đó lưu grep(hoặc ls) đầu ra của bạn như thế này:

    ls --color=always | aha --black --title 'ls-with-colors' > ls-with-colors.html

    tùy chọn:

    --black param to set background as black color
    --title param to set the title for HTML page

Cú pháp tô sáng để mở rộng tập tin qua pygmentize

  • cài đặt pygmentize:

    sudo apt-get install python-pygments
  • sau đó chạy loại lệnh này:

    pygmentize file.pl | grep -i --color=always version | aha --black > ls-with-colors.html

nhập mô tả hình ảnh ở đây


1
AHA !! , aha là một công cụ thực sự tuyệt vời, chính xác những gì tôi đang tìm kiếm, Cảm ơn !!
Moha lạc đà toàn năng

2
@ Mhd.Tahawi: Tôi đã cập nhật câu trả lời của mình để bạn có thể giữ màu mã (perl trong trường hợp của bạn), nhưng pygmentizehoạt động với nhiều người khác.
Sylvain Pineau

10

Tùy thuộc vào những gì bạn muốn làm với tệp đầu ra, có thể thêm màu vào tệp văn bản thông thường vì màu sắc chỉ đơn giản đến từ một số ký tự đặc biệt. Grep dường như không muốn in chúng khi bạn chuyển hướng nó đến một tệp, vì vậy bạn cần buộc nó phải:

grep --color=always "stuff" input.txt > output.txt

Bây giờ, khi bạn in tệp lên bàn điều khiển, nó sẽ được in bằng màu, vì Bash diễn giải các ký tự đó là "sử dụng màu này".

cat output.txt

Tuy nhiên, nếu bạn mở nó trong một trình soạn thảo như thế vim, bạn sẽ nhận được một số ký tự lạ. Ví dụ, khi tôi sử dụng các lệnh

echo "A sentence. A red sentence. Another sentence." \
  | grep --color=always "A red sentence" > output.txt

Đầu ra trông đúng khi tôi in bằng cách sử dụng catnhưng khi tôi mở nó trong vimtôi nhận được

A sentence. ^[[01;31m^[[KA red sentence^[[m^[[K. Another sentence.

Vì vậy, nếu bạn muốn sử dụng một trình soạn thảo thì đây có thể không phải là điều bạn muốn.


Đúng vậy !!, tôi đã nhận được những biểu tượng lạ ở giữa và không hiểu chúng là gì.
Moha lạc đà toàn năng

tôi thực sự thích cách đơn giản / hiệu quả câu trả lời của bạn. chỉ là con mèo đầu ra :). điều này là tuyệt vời cho ngắn hạn (chỉ đủ tốt cho tôi ngay bây giờ).
Trevor Boyd Smith

Chi tiết: Đó là thiết bị đầu cuối (trình giả lập), không phải bash, diễn giải các chuỗi thoát màu (hay còn gọi là các ký tự lạ).
masterxilo

2

Nếu tôi hiểu chính xác bạn muốn lưu một đầu ra thiết bị đầu cuối trong một tệp văn bản, phải không? Nhưng bạn muốn nó được định dạng với màu sắc. Nếu đó là trường hợp, đây là ý tưởng của tôi:

Làm nổi bật đầu ra tự động

Như bạn có thể biết, nếu bạn chụp một đầu ra grep vào một tệp văn bản, chính xác bởi vì đó là một tệp văn bản, nó không thể được tạo thành. Vì vậy, theo tôi biết, bạn không thể làm điều đó một cách dễ dàng.

Mặc dù vậy, có một cách giải quyết đơn giản, bao gồm việc nhận ra trình soạn thảo văn bản của bạn loại tệp đang mở. Ví dụ: giả sử rằng đầu ra grep của bạn có một số thành phần bash, vì vậy các điểm nổi bật bash hoạt động cho bạn (nhân tiện, đây thường là những màu mà bạn nhìn thấy trong một đầu ra có màu trong thiết bị đầu cuối). Vì vậy, mẹo là lưu văn bản đầu ra trong một tệp có phần mở rộng thích hợp. Thay vì làm một cái gì đó như:

ls | grep something > output

bạn có thể đi cho

ls | grep something > output.sh

Điều này sẽ làm cho gedit (hoặc bất kỳ trình soạn thảo văn bản tử tế nào) tự động nhận ra rằng bạn đang nói về mã bash và sẽ làm nổi bật nó theo. Bạn không cần tô màu đầu ra, chương trình sẽ làm điều đó cho bạn nếu nó nhận ra loại mã mà nó đang mở. Nếu bạn đang làm việc với các loại định dạng khác, chỉ cần điều chỉnh tiện ích mở rộng để điều chỉnh tốt hơn cho những gì bạn đang sử dụng (ví dụ> output.xml,> output.html,> output.py ... vv). Chúc may mắn! :)

Làm nổi bật một số từ trong tệp đầu ra

Vì vậy, nếu tôi có nó, bạn muốn làm nổi bật những từ bạn đã tìm kiếm. Một lần nữa, điều đó không thể được thực hiện trong một tệp văn bản đơn giản chỉ vì là một văn bản thuần túy. Tuy nhiên, bạn có thể thêm một số định dạng cho nó theo cách rất dễ dàng như sử dụng một số mã html. Điều này sẽ biến đổi đầu ra của bạn trong một mã html và khi bạn mở nó bằng một chương trình có thể diễn giải html (libreoffice reader, firefox và 10000 etceteras), bạn sẽ thấy một số từ được tô đậm.

Để làm như vậy, giả sử đây là grep của bạn, được xuất sang html:

ls | grep keytext > output.html

Và bây giờ bạn muốn làm nổi bật keytext trong đầu ra của bạn. Bạn có thể sử dụng sed để làm điều đó, như:

sed -i 's/keytext/<font color="red">keytext<\/font>/g' output.html

Và violà, bây giờ keytext của bạn được tô màu đỏ.


1
ý tưởng hay !!, nhưng tôi không tìm kiếm cú pháp tô sáng. bạn biết làm thế nào grep màu từ khóa tìm kiếm với màu khác, thường là màu đỏ. Tôi muốn giữ điều đó để từ khóa nổi bật trong tệp đầu ra.
Moha lạc đà toàn năng

ok, vậy, bạn đang gre một cái gì đó với màu sắc? như mã html? Nếu bạn thấy màu sắc trong đầu vào thì nó phải được định dạng và do đó được mã hóa ở đâu đó, như "fontcolor: red", phải không? Nếu đây là trường hợp, bạn có thể cần phải bao gồm mã định dạng trong grep của bạn. :)
Rho

ok, với chỉnh sửa trong câu hỏi tôi nhận được nó. :) Bạn đang sử dụng phần mở rộng đầu ra nào?
Rho

Tôi đang grepping một mã perl, khi tôi sử dụng phần mở rộng perl, tôi đã có một cú pháp tô màu hoàn chỉnh và tôi đang lấy một tên biến để nó thậm chí không được tô màu.
Moha lạc đà toàn năng
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.