Bir grep çıktısını renkli bir dosyaya kaydetme


36

Bir grep komutunun sonucunu bir dosyaya kaydetmem gerekiyor, ancak çıktı dosyasının da formatlanmasını ve renkleri terminaldeki gibi tutmasını istiyorum.

Bunu yapmanın bir yolu var mı? Belki grep'i bir çeşit biçimlendirme diline kaydedebilirsin? Bu mümkün değilse, bu görevi yerine getirebilecek başka bir araç var mı?

Arama anahtar sözcüğünü, çıkış dosyasında, tıpkı terminalde olduğu gibi, öne çıkarmaya çalışıyorum.

Yanıtlar:


42

İşaretlemeyi korumak için, bir metin dosyasından daha fazlasına ihtiyacınız vardır. Renkleri korumak için HTML çıktısını kullanırdım.

  • Yükleme aha yani "a dönüştürür ANSI çıkış sırasını HTML kodunda unix terminal "

    sudo apt-get install aha
  • sonra grep(veya ls) çıktınızı şöyle kaydedin :

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

    seçenekleri:

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

Dosya uzantısı için sözdizimi vurgulamak pygmentize

  • yükle pygmentize:

    sudo apt-get install python-pygments
  • sonra bu tür bir komutu çalıştırın:

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

görüntü tanımını buraya girin


1
AHA!! , aha gerçekten harika bir araçtır, tam olarak ne arıyordum, teşekkürler!
Yüce deve Moha,

2
@ Mhd.Tahawi: Cevabımı güncelledim, böylece kod renklerini tutabilirsin (senin durumunda perl), ama pygmentizebaşkalarıyla da çalışır.
Sylvain Pineau

10

Çıktı dosyasıyla ne yapmak istediğinize bağlı olarak, normal bir metin dosyasına renkler eklemek mümkündür, çünkü renkler yalnızca bazı özel karakterlerden gelir. Grep, bir dosyaya yönlendirirken yazdırmak istemiyor gibi görünüyor, bu nedenle zorlamanız gerekir:

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

Şimdi, dosyayı konsola yazdırdığınızda, renklerle basılacaktır, çünkü Bash bu karakterleri "bu rengi kullan" olarak yorumlar.

cat output.txt

Ancak, onu bir editörde açarsanız vim, bazı garip karakterler elde edersiniz. Örneğin, komutları kullandığımda

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

Kullanarak yazdırdığımda çıktı doğru görünüyor, catancak açtığımda vimalıyorum

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

Yani bir editör kullanmak istiyorsanız, muhtemelen istediğiniz şey bu değil.


Doğru !!, aralarında garip semboller alıyorum ve bunların ne olduğunu anlamadım.
Yüce deve Moha

Cevabınızın ne kadar basit / etkili olduğunu gerçekten seviyorum. sadece çıktıyı kedi :). Bu kısa vadeli için harika (şu anda benim için yeterince iyi).
Trevor Boyd Smith,

Detay: Renk kaçış dizilerini (diğer adıyla garip karakterler) yorumlayan bash değil terminaldir (emülatör ).
masterxilo

2

Doğru anladıysam, bir terminal çıkışını bir metin dosyasına kaydetmek istiyorsun, değil mi? Ancak renklerle biçimlendirilmesini istiyorsunuz. Eğer durum buysa, işte fikirlerim:

Çıktının otomatik olarak vurgulanması

Muhtemelen bildiğiniz gibi, bir metin dosyasına bir grep çıktısı alırsanız, tam olarak bir metin dosyası olduğu için biçimlendirilemez. Yani, bildiğim kadarıyla, kolay bir şekilde yapamazsınız.

Buna rağmen, metin düzenleyicinizi ne tür bir dosyanın açıldığını fark etmekten oluşan basit bir geçici çözüm vardır. Örneğin, grep çıktınızın bazı bash bileşenlerine sahip olduğunu söyleyelim, bu yüzden bash vurgulamaları sizin için işe yarar (bu arada bunlar terminalde renkli çıktılarda gördüğünüz renklerdir). Bu yüzden püf nokta, metin çıktısını uygun uzantılı bir dosyaya kaydetmektir. Gibi bir şey yapmak yerine:

ls | grep something > output

gidebilirsin

ls | grep something > output.sh

Hangi gedit (veya herhangi bir terbiyeli metin editörü) otomatik olarak bash kodundan bahsettiğinizi otomatik olarak algılar ve buna göre vurgulayacaktır. Çıktıyı renklendirmenize gerek yoktur, açmakta olan kod türünü tanırsa program sizin için yapar. Başka tür formatlarla çalışıyorsanız, uzantıyı, üzerinde çalıştığınız şey için daha iyi ayarlamaya adapte etmeniz yeterlidir (örn.> Output.xml,> output.html,> output.py ... vb.). İyi şanslar! :)

Çıkış dosyasındaki bazı kelimelerin vurgulanması

Öyleyse, anladıysam, aradığın kelimeleri vurgulamak istiyorsun. Yine de, düz metin olduğu için düz metin dosyasında yapılamaz. Ancak, bazı html kodlamaları kullanmak gibi çok kolay bir biçimde format ekleyebilirsiniz. Bu, çıktınızı bir html koduna dönüştürür ve html'i (libreoffice yazarı, firefox ve 10000 etceteras) yorumlayabilen bir programla açtığınızda, bazı sözcüklerin vurgulandığını göreceksiniz.

Bunu yapmak için, html'ye dışa aktarılan grep'iniz olduğunu varsayalım:

ls | grep keytext > output.html

Ve şimdi çıktınızda keytext'i vurgulamak istiyorsunuz . Bunu yapmak için sed kullanabilirsiniz :

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

Ve violà, artık anahtar metniniz kırmızı ile vurgulanmıştır.


1
güzel bir fikir !!, ancak sözdizimi vurgulayarak aramıyorum. Arama anahtar kelimesini başka bir renkle, genellikle kırmızı olan grep rengini bilirsiniz. Anahtar kelimeyi çıktı dosyasında bekletmek istiyorum.
Yüce deve Moha,

Tamam, peki, renkli bir şeyler mi yapıyorsun? HTML kodu gibi? Girişte renk görüyorsanız biçimlendirilmeli ve bu nedenle "fontcolor: red" gibi bir yere kodlanmalı, değil mi? Bu durumda, biçimlendirme kodunu grep'inize eklemeniz gerekebilir. :)
Rho

Tamam, sorudaki düzenleme ile anladım. :) Hangi çıktı uzantısını kullanıyorsunuz?
Rho,

Bir perl kodunu okuyorum, perl uzantısını kullandığımda, tam bir sözdizimi renklendirmesi elde ettim ve değişken bir isim de çiziyorum, böylece renklendirilemiyordu.
Yüce deve Moha,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.