คำสั่ง 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.