วิธีปิดการใช้งานการตัดบรรทัดในเทอร์มินัล


55

ฉันต้องดูไฟล์บันทึกขนาดใหญ่โดยใช้ bash shell ฉันใช้lessเพื่อเปิดไฟล์ แต่เนื่องจากมีความยาวมากเกินไปจึงมีการตัดคำ / คำบางอย่างเกิดขึ้น

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

แต่ตอนนี้ฉันจำเป็นต้องใช้tail -fและมันก็จะตัดบรรทัดเอาต์พุต เป็นไปได้หรือไม่ที่จะปิดการใช้งานการพันบรรทัดในเชลล์ bash สำหรับคำสั่งทั้งหมด?

หมายเหตุ:มีคำตอบสำหรับคำถามที่แตกต่างกันที่กล่าวถึงลำดับการหลบหนีecho -ne '\e[?7l'แต่ดูเหมือนว่าจะไม่สามารถใช้งานได้กับการทุบตี


4
โปรดทราบว่าสิ่งนี้ไม่เกี่ยวข้องกับตัวเลือกของเชลล์ (bash) แต่ขึ้นอยู่กับการเลือกเทอร์มินัล (xterm, Terminal, gnome-terminal, konsole, ... ) ดูอะไรคือความแตกต่างที่แน่นอนระหว่าง 'เทอร์มินัล', 'เชลล์', 'tty' และ 'คอนโซล'?
Gilles 'หยุดความชั่วร้าย'

4
ดังที่ Gilles พูดถึงมันเป็นเรื่องของเทอร์มินัลอีมูเลเตอร์ ตัวอย่างเช่นในscreenมีคำสั่ง "wrap" ในxtermมี-awตัวเลือกในการป้องกันการตัดบรรทัดอัตโนมัติ มีแนวโน้มว่ามีทรัพยากร X บางตัวสำหรับเทอร์มินัลอีมูเลเตอร์อื่น ๆ คุณกำลังใช้โปรแกรมเลียนแบบอะไร
Arcege

gnome-terminalฉันใช้
nunaxe

1
@Arcege: อันที่จริงแล้วมันมี+awไว้สำหรับxterm:) แต่นี่เป็นการแก้ปัญหาสำหรับการส่งออก (เช่นเมื่อls -lมีกลุ่มชื่อ Windows-ish ที่ยาวจาก TPB มันใช้งานได้ดี) สำหรับอินพุตเมื่อป้อนคำสั่งคุณอาจยัง ต้องการการตัดคำ (หรืออย่างน้อยคุณไม่ต้องการแบบที่เป็นอยู่ตอนนี้+aw: ลองเขียนเกิน "เส้นขอบคอลัมน์" แล้วย้อนกลับเพื่อหาจุดบกพร่อง GFX ขนาดใหญ่)
Emanuel Berg

โดยวิธีการที่ดูเหมือนว่าค่าurxvtมิได้rxvtสามารถปิดการตัดสาย
Emanuel Berg

คำตอบ:


7

คุณต้องการจริงๆtail -fหรืออยากless +Fทำอะไร? เนื่องจากดูเหมือนว่าคุณยังคงต้องการเพจเจอร์แบบอินเทอร์แอคทีฟดูเหมือนว่าสำหรับฉันแล้วมันจะง่ายกว่าการติดตั้งlessซ้ำด้วยตัวคุณเอง

หมายเหตุสุดท้าย: คุณได้พิจารณาแล้วtail -f file | lessหรือยัง


ฉันสร้างประสบการณ์ด้วยscreenและxtermเนื่องจากอีมูเลเตอร์เหล่านั้นมีตัวเลือกเพื่อป้องกันการพันบรรทัด แต่มีความแตกต่างใหญ่ระหว่างการตัดทอนเส้นและซ่อนส่วนท้ายของเส้นเพื่อให้เราสามารถดูได้ถ้าเราต้องการ การใช้งานtail -f file | less -Sไม่สมบูรณ์แบบเนื่องจากดูเหมือนว่าจะปิดการใช้งาน-fแต่เป็นทางออกที่ดีที่สุดที่ฉันพบ
nunaxe

คำตอบของ @Boris Marcos น่าจะดีกว่า มันใช้lessโดยตรง
AnthonyD973

51

ลอง:

less -S +F filename

  • กดCtrlcเพื่อหยุด tailing และตอนนี้คุณสามารถเลื่อนไปทางซ้ายและขวาโดยใช้ปุ่มลูกศร
  • กดShiftfเพื่อกลับสู่การปรับค่า
  • กดCtrlc, qที่จะเลิก

มันเยี่ยมมาก! รับมีช่วงขั้วของฉันสองหน้าจอ less -Sแต่ตั้งแต่ผมอ่านเมื่อวานนี้ฉันเพียงแค่ท่อส่งออกกว้าง ยังมีประโยชน์มากบนแล็ปท็อป
Jonatan Öström


15

หากว่าคุณมีCOLUMNSตัวแปรที่กำหนดไว้คุณสามารถดำเนินการได้

tail -f your-app.log | cut -c -$COLUMNS

มิฉะนั้นทดแทนกับความกว้างของคอลัมน์ของอาคารที่เป็นที่ได้รับจาก$COLUMNSstty -a


2
อีกหนึ่งทางเลือกที่จะ$COLUMNS(ไม่ปรับปรุงทันทีในSIGWINCHเฉพาะในพรอมต์ถัดไป) และstty -a(ยากที่จะใช้ในสคริปต์) tput colsเป็น
จัดการ

ขอบคุณ enzotib ใช้งานได้ แต่มันตัดสายและเราไม่สามารถเห็นจุดสิ้นสุดของเส้นยาว เป็นไปได้ไหมที่จะcutทำตัวเหมือนless -Sที่บัฟเฟอร์ยาวและเราสามารถมองเห็นเส้นทั้งหมดโดยใช้ปุ่มทิศทาง?
nunaxe

เอ่อไม่ใช่เรื่องง่าย ฉันกำลังคิดถึงโซลูชันแบบใช้สายเช่นscreenหน้าต่างสองบานที่แยกจากกันแต่ละหน้าต่างมีtail -f | cutสคริปต์หรือแบบจำลองในลักษณะการlessทำงาน แต่ไม่มีวิธีแก้ปัญหาในขณะนี้
enzotib

1
หมายเหตุด้านข้าง: ตัดนับเฉพาะไบต์ ไม่เหมือนless -Sมันจะทำให้ข้อความที่มีสีผิดเพี้ยนหรือสิ่งใดก็ตามที่มีการหลบหนีของ ANSI อาจทำให้ Unicode เสียเช่นกัน
ELLIOTTCABLE

ใช่less -Sมีประโยชน์มากขึ้นกับข้อความสี คุณสามารถใช้less -S -Eเพื่อออกได้ทันที - มีประโยชน์สำหรับการตัดเอาต์พุตสีที่ $ COLUMNS
blueyed

4

คุณสามารถปิดการตัดบรรทัดสำหรับless, tailและทุกคำสั่งอื่น ๆ ภายใต้ดวงอาทิตย์ลินุกซ์ด้วย:

tput rmam

เมื่อต้องการคืนค่าการใช้การตัดบรรทัด:

tput smam

3

เทอร์มินัลเทอร์มิเนเตอร์ (http://software.jessies.org/terminator/) เทอร์มินัลอีมูเลเตอร์อนุญาตให้ไม่พันบรรทัดยาวและมีการเลื่อนในแนวนอน (แต่เขียนใน Java)


ฉันจะเปิดใช้งานได้อย่างไร ดูเหมือนว่าจะไม่ทำงานตามค่าเริ่มต้น
defhlt

ตามการเขียนนี้การเลื่อนตามแนวนอนจะเปิดตามค่าเริ่มต้น คำแนะนำข้ามแพลตฟอร์มที่ยอดเยี่ยม ขอบคุณ!
user7089

โปรดทำให้คำตอบนี้ดีขึ้นโดยการแสดงว่าจะเปิดใช้งานคุณลักษณะนี้อย่างไร ฉันค้นหาในค่ากำหนดและดูเหมือนจะไม่พบตัวเลือกนี้ FWIW, terminator v1.91ฉันกำลังทำงาน
AnthonyK

2
@AnthonyK มีเทอร์มินัลอีมูเลเตอร์สองตัวที่ไม่เกี่ยวข้องกับการแชร์ชื่อterminatorอันนี้ซึ่ง gentledevil กำลังอ้างถึงและสิ่งที่คุณกำลังใช้อยู่
jlliagre

3

สองคำตอบ / ตัวอย่างที่ดีที่นี่

http://www.commandlinefu.com/commands/view/1710/tail-a-log-file-with-long-lines-truncated

tail -f logfile.log | cut -b 1-80

tail -f logfile.log | cut -b -$(tput cols)

หนึ่งข้อแม้: อย่างน้อยก็ในเทอร์มินัลในตัวบนการตัด Mac ของฉันดูเหมือนจะไม่รองรับอักขระแท็บได้เป็นอย่างดี ดูเหมือนว่ามันจะแสดงพวกมันด้วยเช่น 8 ช่องว่าง แต่เพียงคำนวณพวกเขาเป็นความกว้าง 4 ช่องว่างหรืออะไรทำนองนั้น กล่าวอีกนัยหนึ่งถ้าเทอร์มินัลของคุณมีความกว้าง 80 ตัวอักษรและเอาต์พุตของคุณมีแท็บหลายแท็บต่อบรรทัดคุณต้องตั้งค่าความกว้างเป็น 60 หรืออย่างนั้น YMMV


2

lessใช้ด้านล่างตัวเลือกด้วย มันจะปิดการใช้งานการตัดคำและรักษาสีข้อความถ้าระบุ

less -SR +F filename


2

มีตัวอย่างบางส่วนในหน้านี้ pip-tail ที่มี -f ... จากการทดสอบของฉันมันทำงานไม่ถูกต้องหากคุณต้องการ piping (เช่นถ้าคุณต้องการ piping มากกว่านี้เช่น grep) คุณอาจใช้สิ่งที่ชอบ :

watch -n 1 'tail -n $(($LINES-3)) file.log | cut -c -$COLUMNS'

ไม่ใช่ประสิทธิภาพที่ดีที่สุด แต่อาจใช้งานได้ ... อื่นถ้าไม่ต้องการการจิ้มพิเศษคุณอาจใช้สิ่งที่แตกต่างเช่น

less -S +F file.log

2

มีความคิดเห็นมากมายที่หลงทางจากคำถามนี้ คำถามของ OP คือ

แต่ตอนนี้ฉันจำเป็นต้องใช้tail -fและมันก็จะตัดบรรทัดเอาต์พุต เป็นไปได้หรือไม่ที่จะปิดการใช้งานการพันบรรทัดในเชลล์ bash สำหรับคำสั่งทั้งหมด?

มีการแสดงความคิดเห็นบางอย่างเกี่ยวกับคุณสมบัติ autowrap โดยระบุว่าไม่ใช่เทอร์มินัลทั้งหมดที่มี บางที. แต่ (นอกเหนือจากเทอร์มิซึ่งนักพัฒนาเอกสารไม่มีคำอธิบายขั้ว ) ทั้งหมดของตัวอย่างที่กำหนดเป็น xterm, rxvt และบางส่วนเหมือนกันหรือสืบเชื้อสายมา ทั้งหมดเกี่ยวข้องกัน

+awตัวเลือกในxtermสอดคล้องกับautoWrapทรัพยากร ให้คำปรึกษาคู่มือก็บอกว่า

   autoWrap (class AutoWrap)
           Specifies  whether  or  not  auto-wraparound should be enabled.
           This is the same as the VT102 DECAWM.  The default is "true".

และในXTerm Control Sequenceก็บอกว่า

CSI ? Pm h
          ...
          DEC Private Mode Set (DECSET).
            Ps = 7  -> Wraparound Mode (DECAWM).

ซึ่งแน่นอนไม่ได้ "ขึ้นอยู่กับตัวเลือกของเทอร์มินัล" เนื่องจากเทอร์มินัลใด ๆ ที่มีความเข้ากันได้กับ VT100 รองรับคุณสมบัตินี้ xterm และ rxvt ทำสิ่งนี้เช่น คนอื่นทำเช่นกัน

คุณลักษณะนี้จะมีประโยชน์สำหรับ OP หรือไม่เป็นที่ถกเถียงกัน การระงับการตัดบรรทัดเป็นปัญหาหนึ่งด้าน:

  • เชลล์รู้ถึงความกว้างของเทอร์มินัล แต่สามารถลบล้างได้โดยการตั้งค่าCOLUMNSเป็น "ใหญ่"
  • แน่นอนซึ่งหมายความว่าแอปพลิเคชันจะใช้เวลาเขียนที่ขอบขวามาก (และบางอันทำให้มันผิดจะเริ่มขึ้นบรรทัดใหม่ต่อไป)
  • OP อาจสันนิษฐานว่าแอปพลิเคชันจะเลื่อนไปทางซ้าย / ขวาเพื่อให้สามารถใช้งานเทอร์มินัลแบบกว้างได้ (เทอร์มินัลทำสิ่งนี้ - บางส่วน - แต่ข้อเสียอื่น ๆ ของมันจะยกเลิกนั้นยกเว้นผู้ที่ใช้เทอร์มินัลเพียงเพื่อcat'logfile ไปที่หน้าจอ)
  • สิ่งที่ OP กำลังมองหาคือชุดเครื่องมือที่สามารถบอกให้ปิดการใช้งานการพันบรรทัดโดยเฉพาะอย่างยิ่งสำหรับการดูไฟล์บันทึก หากเทอร์มินัลทำงานได้ดีเพียงพอสำหรับการใช้งานทั่วไปมันไม่เกี่ยวข้องกับทางเลือกของเครื่องมือที่ใช้ในเทอร์มินัล

มีวิทยุติดตามตัวซึ่งสามารถทำสิ่งที่ต้องการได้เช่นมัลติทาสก์ซึ่งแสดงรายการในคุณสมบัติของมัน

การตัดบรรทัดสามารถปิดได้หลังจากนั้นสามารถเลื่อนไปทางซ้าย / ขวาด้วยปุ่มลูกศร

ควรใช้เทอร์มินัลอ้างอิงใด ๆ


1

vi

ภายในประเภท vi

:set nowrap

ฉันเชื่อว่ามีปลั๊กอินสำหรับ vi ที่จะให้หางเหมือนพฤติกรรม


-1

หากคุณต้องการเห็นเส้นเต็มคุณสามารถคัดลอกและวางข้อความลงในโปรแกรมแก้ไขข้อความเช่น Atom หรือ Notepad ++ และปิดการใช้งานการตัดบรรทัดในนั้น

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