คำสั่ง unix สำหรับการลบอักขระ N ตัวแรกของบรรทัดคืออะไร


238

ตัวอย่างเช่นฉันอาจต้องการ:

tail -f logfile | grep org.springframework | <command to remove first N characters>

ฉันคิดว่าtrอาจมีความสามารถในการทำเช่นนี้ แต่ฉันไม่แน่ใจ

คำตอบ:


355

cutใช้ เช่น. เพื่อตัดอักขระ 4 ตัวแรกของแต่ละบรรทัด (เช่นเริ่มบนอักขระตัวที่ 5):

tail -f logfile | grep org.springframework | cut -c 5-

1
คุณมีความคิดว่าทำไมท่อไม่ทำงาน? เมื่อฉันเรียกใช้คำสั่งนั้นเป็นหลัก 'ตัด' จะไม่พิมพ์ผลลัพธ์ไปยัง stdout ... หากฉันเพิ่งเรียกใช้ 'tail -f logfile | ตัด -c 5- 'ฉันสามารถเห็นผลลัพธ์ได้ ... ปัญหาต้องเกิดขึ้นกับ grep ฉันใช้ cygwin FYI ขอบคุณ
les2

จะเกิดอะไรขึ้นถ้าคุณไม่เพิ่มท่อสุดท้ายและตัด? โดยพื้นฐานถ้าคุณลบส่วนสุดท้ายของบรรทัด
LB40

มัน "ก้อย" logfile กรองด้วย grep (เช่นทุกบรรทัดที่มี "org.springframework" ในพวกเขาจะถูกพิมพ์ไปยัง stdout) เมื่อฉันเพิ่มไปที่ท่อ 'ตัด' ... มันแฮงเอาท์อย่างไรถ้าฉันกำจัด 'grep' the 'cut' ทำงานได้อย่างถูกต้อง ... ฉันกำลังคิดว่ามีบางอย่างผิดปกติกับวิธีที่ฉันใช้ grep ... อาจเป็นสิ่งที่ cygwin ด้วย
les2

1
ทำไมฉันถึงใช้หาง? เพียงทำ grep org.springframework logfile | ตัด -c 5- แต่ฉันคิดว่า sed เป็นดีกว่า :-)
LB40

6
ปัญหาคือ grep นั้นกำลังบัฟเฟอร์ชิ้นใหญ่ก่อนที่จะส่งให้ตัดเพราะจะเห็นว่ามันไม่ได้เขียนลงในเทอร์มินัล ใช้grep --line-buffered "org.springframeworkเพื่อแก้ไขปัญหานั้น
Steen Schütt

48
sed 's/^.\{5\}//' logfile 

และคุณแทนที่ 5 ด้วยจำนวนที่คุณต้องการ ... มันควรจะทำเคล็ดลับ ...

แก้ไข ถ้าสำหรับแต่ละบรรทัด sed 's/^.\{5\}//g' logfile


29

คุณสามารถใช้cut:

cut -c N- file.txt > new_file.txt

-c: ตัวละคร

file.txt: ไฟล์อินพุต

new_file.txt: ไฟล์ที่ส่งออก

N-: อักขระจาก N ถึงจุดสิ้นสุดที่จะตัดและส่งออกไปยังไฟล์ใหม่

ยังสามารถมีเนื้อหาอื่น ๆ เช่น: 'N', 'N-M', '-M' หมายถึงอักขระที่ n, อักขระที่ n ถึง mth, ตัวอักษรแรกถึง mth ตามลำดับ

สิ่งนี้จะดำเนินการกับแต่ละบรรทัดของไฟล์อินพุต


4
tail -f logfile | grep org.springframework | cut -c 900-

จะลบอักขระแรก 900 ตัว

cut ใช้ 900- เพื่อแสดงอักขระที่ 900 ถึงท้ายบรรทัด

อย่างไรก็ตามเมื่อฉันทำสิ่งเหล่านี้ผ่าน grep ฉันไม่ได้อะไรเลย


4
"cut -c 1-900" จะไม่ "ลบอักขระ 900 ตัวแรก" - จะเหลือเพียงอักขระแรกเท่านั้น หากคุณต้องการลบ 900 ตัวอักษรแรกให้ใช้ "cut -c
901-

นอกจากนี้ยังจะเป็น 900 ตัวอักษรแรกในแต่ละบรรทัดต่อคำตอบของ @ iammichael
แบลร์คอนราด

1
'cut -c 900- "จะลบอักขระ 899 ตัวแรกไม่ใช่หรือ
Yiding Zhou

4

ฉันคิดว่าawkจะเป็นเครื่องมือที่ดีที่สุดสำหรับสิ่งนี้เพราะมันสามารถกรองและดำเนินการฟังก์ชั่นการจัดการสตริงที่จำเป็นในบรรทัดที่กรอง:

tail -f logfile | awk '/org.springframework/ {print substr($0, 6)}'

หรือ

tail -f logfile | awk '/org.springframework/ && sub(/^.{5}/,"",$0)'

1

นี่คือฟังก์ชั่นที่เรียบง่ายผ่านการทดสอบในทุบตี ฟังก์ชั่น param แรกคือ string, param ที่ 2 คือจำนวนอักขระที่จะแยก

function stringStripNCharsFromStart { echo ${1:$2:${#1}} }

การใช้งาน: ป้อนคำอธิบายรูปภาพที่นี่


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