บันทึกเอาต์พุตของ grep ลงในไฟล์ที่มีสี


36

ฉันต้องการบันทึกผลลัพธ์ของคำสั่ง grep ลงในไฟล์ แต่ฉันต้องการให้ไฟล์เอาต์พุตถูกจัดรูปแบบและเก็บสีเหมือนในเทอร์มินัล

มีวิธีทำเช่นนั้นหรือไม่? อาจทำให้ grep บันทึกเป็นภาษามาร์กอัปบางประเภทหรือไม่ หากไม่สามารถทำได้มีเครื่องมืออีกอย่างที่สามารถทำภารกิจนี้ให้สำเร็จได้หรือไม่?

ฉันพยายามทำให้คำหลักในการค้นหาโดดเด่นในไฟล์เอาต์พุตเหมือนกับในเทอร์มินัล

คำตอบ:


42

เพื่อให้มาร์กอัปนั้นคุณต้องมีมากกว่าไฟล์ข้อความ ฉันจะใช้การส่งออก HTML เพื่อให้สี

  • ติดตั้งaha ie เพื่อ "แปลงลำดับการหลบหนีของ ANSI ของเทอร์มินัล unix เป็นรหัส HTML "

    sudo apt-get install aha
  • จากนั้นบันทึกเอาต์พุตgrep(หรือls) ของคุณเช่นนี้:

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

    ตัวเลือก:

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

เน้นไวยากรณ์สำหรับนามสกุลไฟล์ผ่าน pygmentize

  • ติดตั้งpygmentize:

    sudo apt-get install python-pygments
  • จากนั้นเรียกใช้คำสั่งประเภทนี้:

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

ป้อนคำอธิบายรูปภาพที่นี่


1
AHA !! , AHAเป็นเครื่องมือที่ยอดเยี่ยมจริงๆว่าสิ่งที่ผมกำลังมองหาขอบคุณ !!
Moha อูฐยิ่งใหญ่

2
@ Mhd.Tahawi: ฉันได้อัปเดตคำตอบของฉันเพื่อให้คุณสามารถเก็บรหัสสี (perl ในกรณีของคุณ) แต่pygmentizeทำงานได้กับคนอื่น ๆ
Sylvain Pineau

10

ขึ้นอยู่กับสิ่งที่คุณต้องการทำกับไฟล์เอาต์พุตคุณสามารถเพิ่มสีให้กับไฟล์ข้อความปกติได้เนื่องจากสีนั้นมาจากอักขระพิเศษบางตัว Grep ดูเหมือนจะไม่ต้องการพิมพ์เมื่อคุณเปลี่ยนเส้นทางไปยังไฟล์ดังนั้นคุณต้องบังคับให้:

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

ตอนนี้เมื่อคุณพิมพ์ไฟล์ไปยังคอนโซลมันจะถูกพิมพ์ด้วยสีเพราะ Bash ตีความตัวละครเหล่านั้นว่า "ใช้สีนี้"

cat output.txt

อย่างไรก็ตามหากคุณเปิดในโปรแกรมแก้ไขอย่างvimคุณจะได้ตัวละครแปลก ๆ ตัวอย่างเช่นเมื่อฉันใช้คำสั่ง

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

ผลงานออกมาดูถูกต้องเมื่อฉันพิมพ์โดยใช้catแต่เมื่อเปิดในที่vimฉันได้รับ

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

ดังนั้นหากคุณต้องการใช้เครื่องมือแก้ไขสิ่งนี้อาจไม่ใช่สิ่งที่คุณต้องการ


ถูกต้อง !! ฉันได้รับสัญลักษณ์แปลก ๆ เหล่านั้นในระหว่างนั้นและไม่เข้าใจสิ่งเหล่านั้น
Moha อูฐผู้ทรงอำนาจ

ฉันชอบคำตอบของคุณง่ายๆ แค่เอาท์พุทแมว :) นี่ยอดเยี่ยมในระยะสั้น (ดีพอสำหรับฉันตอนนี้)
เทรเวอร์บอยด์สมิ ธ

รายละเอียด: เป็นเทอร์มินัล (อีมูเลเตอร์) ไม่ใช่ทุบตีซึ่งตีความลำดับการหลบหลีกสี(อาคาอักขระแปลก ๆ )
masterxilo

2

ถ้าฉันเข้าใจถูกต้องคุณต้องการบันทึกผลลัพธ์เทอร์มินัลในไฟล์ข้อความใช่ไหม แต่คุณต้องการให้มีการจัดรูปแบบด้วยสี หากเป็นกรณีนี้เป็นความคิดของฉัน:

ไฮไลต์เอาท์พุทโดยอัตโนมัติ

อย่างที่คุณอาจทราบว่าถ้าคุณจับเอาท์พุท grep ลงในไฟล์ข้อความเพราะมันเป็นไฟล์ข้อความมันไม่สามารถจัดรูปแบบได้ ดังนั้นเท่าที่ฉันรู้คุณไม่สามารถทำได้ในวิธีที่ง่าย

ทั้งๆที่มีวิธีแก้ปัญหาง่าย ๆ ประกอบไปด้วยการทำให้ตระหนักถึงการแก้ไขข้อความของคุณสิ่งที่ชนิดของไฟล์ที่จะเปิด ตัวอย่างเช่นสมมติว่าเอาต์พุต grep ของคุณมีองค์ประกอบทุบตีบางส่วนดังนั้นไฮไลต์ทุบตีทำงานได้สำหรับคุณ (โดยวิธีการเหล่านี้มักเป็นสีที่คุณเห็นในเอาต์พุตสีในเทอร์มินัล) ดังนั้นเคล็ดลับคือการบันทึกผลลัพธ์ข้อความในไฟล์ที่มีนามสกุลที่เหมาะสม แทนที่จะทำสิ่งที่ชอบ:

ls | grep something > output

คุณอาจไปเพื่อ

ls | grep something > output.sh

ซึ่งจะทำให้ gedit (หรือโปรแกรมแก้ไขข้อความที่เหมาะสม) โดยอัตโนมัติรับรู้ว่าคุณกำลังพูดถึงรหัสทุบตีและจะเน้นมันตาม คุณไม่จำเป็นต้องระบายสีเอาท์พุทโปรแกรมจะทำเพื่อคุณถ้ามันรับรู้ถึงประเภทของรหัสที่กำลังเปิดอยู่ หากคุณทำงานกับรูปแบบประเภทอื่น ๆ ให้ปรับส่วนขยายให้เหมาะกับสิ่งที่คุณทำใน greping (เช่น> output.xml,> output.html,> output.py ... ฯลฯ ) โชคดี! :)

ไฮไลต์คำบางคำในไฟล์เอาต์พุต

ดังนั้นถ้าฉันเข้าใจคุณต้องการเน้นคำที่คุณค้นหา อีกครั้งที่ไม่สามารถทำได้ในไฟล์ข้อความธรรมดาเพียงเพราะเป็นข้อความธรรมดา อย่างไรก็ตามคุณสามารถเพิ่มรูปแบบบางรูปแบบในวิธีที่ง่ายมากเช่นการใช้การเข้ารหัส HTML สิ่งนี้จะแปลงผลลัพธ์ของคุณในรหัส html และเมื่อคุณเปิดมันด้วยโปรแกรมที่สามารถตีความ html (นักเขียน libreoffice, firefox และ 10,000 etceteras) คุณจะเห็นคำบางคำที่เน้น

ในการทำเช่นนี้สมมติว่าเป็น grep ของคุณส่งออกเป็น html:

ls | grep keytext > output.html

และตอนนี้คุณต้องการเน้นข้อความสำคัญในผลลัพธ์ของคุณ คุณสามารถใช้sedเพื่อทำเช่น:

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

และviolàทีนี้ข้อความของคุณก็จะเป็นสีแดง


1
เป็นความคิดที่ดี !! แต่ฉันไม่ได้มองหาการเน้นไวยากรณ์ คุณรู้ว่า grep สีคำค้นหาที่มีสีอื่นมักสีแดง ฉันต้องการที่จะเก็บไว้ดังนั้นคำหลักที่โดดเด่นในไฟล์ที่ส่งออก
Moha อูฐยิ่งใหญ่

ตกลงดังนั้นคุณกำลัง greping บางสิ่งบางอย่างที่มีสี? ชอบรหัส html หรือไม่ ถ้าคุณเห็นสีในอินพุตก็จะต้องมีการจัดรูปแบบและรหัสดังนั้นบางแห่งเช่น "fontcolor: red" ใช่ไหม? หากเป็นกรณีนี้คุณอาจต้องใส่รหัสการจัดรูปแบบใน grep ของคุณ :)
Rho

ตกลงกับการแก้ไขในคำถามที่ฉันได้รับมัน :) คุณใช้ส่วนขยายผลลัพธ์อะไร
Rho

ฉัน grepping รหัส perl เมื่อฉันใช้ส่วนขยาย perl ฉันได้รับการระบายสีไวยากรณ์สมบูรณ์และฉัน greping ชื่อตัวแปรดังนั้นจึงไม่มีสีแม้แต่
Moha อูฐยิ่งใหญ่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.