Menyimpan output grep ke file dengan warna

36

Saya perlu menyimpan hasil dari perintah grep ke file, tetapi saya juga ingin file output diformat dan menjaga warna seperti di terminal.

Apakah ada cara untuk melakukan itu? Mungkin membuat grep menyimpan ke semacam bahasa markup? Jika tidak memungkinkan, apakah ada alat lain yang dapat menyelesaikan tugas ini?

Saya mencoba membuat kata kunci pencarian menonjol di file output, persis seperti yang ada di terminal.

Moha unta yang mahakuasa
sumber

Jawaban:

43

Untuk mempertahankan markup, Anda perlu lebih dari sekadar file teks. Saya akan menggunakan output HTML untuk menjaga warna.

  • Instal aha yaitu untuk "mengubah urutan pelarian ANSI dari terminal unix ke kode HTML "

    sudo apt-get install aha
  • kemudian simpan grep(atau ls) output Anda seperti ini:

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

    pilihan:

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

Sorotan sintaks untuk ekstensi file melalui pygmentize

  • pasang pygmentize:

    sudo apt-get install python-pygments
  • kemudian jalankan perintah semacam ini:

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

masukkan deskripsi gambar di sini

Sylvain Pineau
sumber
1
AHA !! , aha adalah alat yang sangat luar biasa, persis apa yang saya cari, Terima kasih !!
Moha unta maha kuasa
2
@ Mhd.Tahawi: Saya telah memperbarui jawaban saya sehingga Anda dapat menyimpan warna kode (perl dalam kasus Anda), tetapi pygmentizebekerja dengan banyak lainnya.
Sylvain Pineau
10

Tergantung pada apa yang ingin Anda lakukan dengan file output, dimungkinkan untuk menambahkan warna ke file teks normal karena warna hanya berasal dari beberapa karakter khusus. Grep tampaknya tidak ingin mencetaknya saat Anda mengarahkan ulang ke file, jadi Anda harus memaksanya untuk:

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

Sekarang, ketika Anda mencetak file ke konsol itu akan dicetak dengan warna, karena Bash menafsirkan karakter tersebut sebagai "gunakan warna ini".

cat output.txt

Namun, jika Anda membukanya di editor seperti vim, Anda akan mendapatkan beberapa karakter aneh. Misalnya, ketika saya menggunakan perintah

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

Outputnya terlihat benar ketika saya mencetaknya menggunakan cattetapi ketika saya membukanya vimsaya dapatkan

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

Jadi jika Anda ingin menggunakan editor, ini mungkin bukan yang Anda inginkan.

MasterOfBinary
sumber
Benar !!, saya mendapatkan simbol-simbol aneh di antaranya dan tidak mengerti apa itu.
Moha unta maha kuasa
Saya sangat suka betapa sederhana / efektifnya jawaban Anda. hanya cat output :). ini bagus untuk jangka pendek (cukup baik untuk saya saat ini).
Trevor Boyd Smith
Detail: Terminal (emulator), bukan bash, yang mengartikan urutan pelarian warna (alias karakter aneh).
masterxilo
2

Jika saya mengerti benar Anda ingin menyimpan keluaran terminal dalam file teks, kan? Tapi Anda ingin diformat dengan warna. Jika itu masalahnya, inilah gagasan saya:

Sorot output secara otomatis

Seperti yang mungkin Anda ketahui, jika Anda menangkap keluaran grep ke file teks, justru karena itu adalah file teks, itu tidak dapat diformat. Jadi, sejauh yang saya tahu, Anda tidak dapat melakukannya dengan mudah.

Meskipun demikian ada solusi sederhana, yang terdiri dari membuat menyadari editor teks Anda apa jenis file yang dibuka. Sebagai contoh, katakanlah bahwa keluaran grep Anda memiliki beberapa komponen bash, jadi bash highlight berfungsi untuk Anda (omong-omong, ini sering merupakan warna yang Anda lihat dalam keluaran berwarna di terminal). Jadi triknya adalah menyimpan output teks dalam file dengan ekstensi yang tepat. Alih-alih melakukan sesuatu seperti:

ls | grep something > output

Anda dapat pergi untuk

ls | grep something > output.sh

Yang akan membuat gedit (atau editor teks yang layak) secara otomatis mengenali bahwa Anda berbicara tentang kode bash, dan akan menyorotnya sesuai. Anda tidak perlu mewarnai output, program akan melakukannya untuk Anda jika ia mengenali jenis kode yang dibuka. Jika Anda bekerja dengan jenis format lain, sesuaikan saja ekstensi dengan penyesuaian yang lebih baik untuk apa yang Anda garap (mis.> Output.xml,> output.html,> output.py ... dll). Semoga berhasil! :)

Sorot beberapa kata dalam file output

Jadi, jika saya mengerti, Anda ingin menyorot kata-kata yang Anda cari. Sekali lagi, itu tidak dapat dilakukan dalam file teks biasa hanya karena teks biasa. Namun Anda dapat menambahkan beberapa format ke dalamnya dengan cara yang sangat mudah seperti menggunakan beberapa kode html. Ini akan mengubah output Anda dalam kode html, dan ketika Anda membukanya dengan program yang dapat menginterpretasikan html (penulis libreoffice, firefox, dan 10000 dll) Anda akan melihat beberapa kata yang disorot.

Untuk melakukannya, katakanlah ini grep Anda, diekspor ke html:

ls | grep keytext > output.html

Dan sekarang Anda ingin menyorot keytext di output Anda. Anda dapat menggunakan sed untuk melakukannya, seperti:

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

Dan, sekarang keytext Anda disorot dengan warna merah.

Rho
sumber
1
ide bagus !!, tapi saya tidak mencari highlight sintaks. Anda tahu bagaimana grep mewarnai kata kunci pencarian dengan warna lain, biasanya merah. Saya ingin menjaga agar kata kunci tetap menonjol di file output.
Moha unta maha kuasa
ok, jadi, kamu menangkap sesuatu dengan warna? seperti kode html? Jika Anda melihat warna pada input maka harus diformat dan karenanya dikodekan di suatu tempat, seperti "fontcolor: red", kan? Jika ini masalahnya, Anda mungkin perlu memasukkan kode pemformatan di grep Anda. :)
Rho
ok, dengan edit di pertanyaan saya mengerti. :) Ekstensi keluaran apa yang Anda gunakan?
Rho
Saya mendapatkan kode perl, ketika saya menggunakan ekstensi perl, saya mendapatkan pewarnaan sintaks yang lengkap, dan saya menggerutu nama variabel sehingga bahkan tidak berwarna.
Moha unta maha kuasa