หากฉันใช้cat -n text.txt
เพื่อกำหนดหมายเลขบรรทัดโดยอัตโนมัติฉันจะใช้คำสั่งเพื่อแสดงเฉพาะหมายเลขที่กำหนดได้อย่างไร
tail
+ head
ยังสามารถทำสิ่งนี้ได้เช่นกันawk
หากฉันใช้cat -n text.txt
เพื่อกำหนดหมายเลขบรรทัดโดยอัตโนมัติฉันจะใช้คำสั่งเพื่อแสดงเฉพาะหมายเลขที่กำหนดได้อย่างไร
tail
+ head
ยังสามารถทำสิ่งนี้ได้เช่นกันawk
คำตอบ:
ใช้ sed
การใช้
$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
หากต้องการพิมพ์หนึ่งบรรทัด (5)
$ sed -n 5p file
Line 5
หากต้องการพิมพ์หลายบรรทัด (5 & 8)
$ sed -n -e 5p -e 8p file
Line 5
Line 8
เพื่อพิมพ์ช่วงที่เฉพาะเจาะจง (5 - 8)
$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8
เมื่อต้องการพิมพ์ช่วงด้วยบรรทัดที่ระบุอื่น ๆ (5 - 8 & 10)
$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10
วิธีหนึ่งในการทำคือใช้sed
:
cat -n text.txt | sed '11d'
โดยที่ 11 คือจำนวนบรรทัดที่คุณต้องการลบ
หรือลบทั้งหมดยกเว้น 11:
cat -n text.txt | sed '11!d'
ช่วงยังเป็นไปได้:
cat -n text.txt | sed '9,12!d'
และcat -n
ไม่จำเป็นแม้แต่:
sed '9,12!d' text.txt
คุณสามารถใช้ awk ตรงขึ้น
awk 'NR==1' file.txt
แทนที่ '1' ด้วยหมายเลขบรรทัดที่ต้องการ
ขึ้นอยู่กับเป้าหมายที่ฉันชอบหัวหรือ grep
cat /var/log/syslog -n | head -n 50 | tail -n 10
จะส่งคืนบรรทัดที่ 41 ถึง 50
หรือ
cat /var/log/syslog -n | grep " 50" -b10 -a10
จะแสดงบรรทัดที่ 40 ถึง 60 ปัญหากับวิธีการ grep คือคุณต้องใช้บัญชีสำหรับการใส่หมายเลขบรรทัด (สังเกตช่องว่าง)
ทั้งสองค่อนข้างมีประโยชน์สำหรับการแยกวิเคราะห์ไฟล์บันทึก
cat
แม้ว่า
cat
ไม่สามารถทำสิ่งที่ OP ต้องการได้
cat -n
เป็นคนอื่นได้แสดงให้เห็นว่าคุณไม่มีความจำเป็นต้องใช้ โปรแกรมอื่น ๆ จะทำเพื่อคุณ อย่างไรก็ตามหากคุณจำเป็นต้องแยกวิเคราะห์ผลลัพธ์cat -n
และแสดงเฉพาะบรรทัดที่เฉพาะเจาะจง (เช่น 4-8, 12 และ 42) คุณสามารถทำได้:
$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42'
4 Line 4
5 Line 5
6 Line 6
7 Line 7
8 Line 8
12 Line 12
42 Line 42
ในawk
, $1
เป็นเขตแรกดังนั้นคำสั่งนี้พิมพ์ทุกสายที่มีสาขาแรก i) ระหว่างวันที่ 4 และ 8 (รวม) หรือ ii) 12 หรือ iii) 42
หากคุณต้องการลบฟิลด์ที่เพิ่มโดยcat -n
รับบรรทัดต้นฉบับจากไฟล์คุณสามารถทำได้:
$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42{sub(/^\s*[0-9]+\s*/,""); print}'
Line 4
Line 5
Line 6
Line 7
Line 8
Line 12
Line 42