ด้วยคำสั่ง Linux“ cat” ฉันจะแสดงเฉพาะบางบรรทัดตามจำนวนได้อย่างไร


59

หากฉันใช้cat -n text.txtเพื่อกำหนดหมายเลขบรรทัดโดยอัตโนมัติฉันจะใช้คำสั่งเพื่อแสดงเฉพาะหมายเลขที่กำหนดได้อย่างไร


1
คุณหมายถึงอะไรด้วยการ "แสดงเฉพาะตัวเลขที่มีตัวเลขเท่านั้น" คุณสามารถใส่ผลลัพธ์ที่ต้องการได้หรือไม่?
ทาโช

1
อาจมีวิธีเป็นล้านที่ทำเช่นนี้ tail+ headยังสามารถทำสิ่งนี้ได้เช่นกันawk
Bratchley

คำตอบ:


120

ใช้ 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

27

วิธีหนึ่งในการทำคือใช้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

9

คุณสามารถใช้ awk ตรงขึ้น

awk 'NR==1' file.txt

แทนที่ '1' ด้วยหมายเลขบรรทัดที่ต้องการ


1
นี่คือคำตอบที่ดีที่สุดที่นี่โดยล้านไมล์และสมควรได้รับความรักมากกว่าที่เป็นอยู่
นกกระจิบ

8

ขึ้นอยู่กับเป้าหมายที่ฉันชอบหัวหรือ 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แม้ว่า
roaima

1
ใช่ ... แต่ .... แต่ ... แต่ ..... มีวิธีที่ดีกว่า คำถามที่ถามเกี่ยวกับการใช้แมวดังนั้นฉันจึงใช้มัน
coteyr

catไม่สามารถทำสิ่งที่ OP ต้องการได้
roaima

2

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