Với lệnh catiến Linux Linux, làm cách nào để chỉ hiển thị một số dòng nhất định theo số


59

Nếu tôi sử dụng cat -n text.txtđể tự động đánh số các dòng, làm thế nào để tôi sử dụng lệnh để chỉ hiển thị các dòng được đánh số nhất định.


1
Bạn có ý nghĩa gì với "chỉ hiển thị các dòng được đánh số nhất định", bạn có thể đặt một đầu ra dự kiến ​​không?
tachomi

1
Có lẽ sẽ có một triệu cách để làm điều này. tail+ headcũng có thể làm điều này, như có thểawk
Bratchley

Câu trả lời:


120

Sử dụng sed

Sử dụng

$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

Để in một dòng (5)

$ sed -n 5p file
Line 5

Để in nhiều dòng (5 & 8)

$ sed -n -e 5p -e 8p file
Line 5
Line 8

Để in phạm vi cụ thể (5 - 8)

$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8

Để in phạm vi với dòng cụ thể khác (5 - 8 & 10)

$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10

27

Một cách để làm điều đó là bằng cách sử dụng sed:

cat -n text.txt | sed '11d'

trong đó 11 là số dòng bạn muốn xóa.

Hoặc để xóa tất cả trừ 11:

cat -n text.txt | sed '11!d'

Phạm vi cũng có thể:

cat -n text.txt | sed '9,12!d'

cat -nthậm chí không cần thiết:

sed '9,12!d' text.txt

9

Bạn có thể sử dụng awk thẳng lên.

awk 'NR==1' file.txt

thay thế '1' bằng số dòng mong muốn.


1
Đây là một triệu dặm câu trả lời tốt nhất ở đây và xứng đáng hơn rất nhiều tình yêu hơn nó có.
Wren

8

Tùy thuộc vào mục tiêu tôi thích đầu hoặc grep

cat /var/log/syslog -n | head -n 50 | tail -n 10

sẽ trả về dòng 41 đến 50.

hoặc là

cat /var/log/syslog -n | grep " 50" -b10 -a10

sẽ hiển thị các dòng từ 40 đến 60. Vấn đề với phương thức grep là bạn phải sử dụng tài khoản để đệm các số dòng (chú ý khoảng trắng)

Cả hai đều khá tiện dụng để phân tích tệp nhật ký.


Cả dụ cần cat
roaima

1
vâng ... nhưng .... nhưng ... ..... Có nhiều cách tốt hơn. Câu hỏi hỏi về việc sử dụng mèo mặc dù, vì vậy tôi đã sử dụng nó.
coteyr

catkhông thể làm những gì OP muốn
roaima

2

Như những người khác đã chỉ cho bạn, không có nhu cầu sử dụng cat -n. Các chương trình khác sẽ làm điều đó cho bạn. Tuy nhiên, nếu bạn thực sự cần phân tích đầu ra cat -nvà chỉ hiển thị các dòng cụ thể (ví dụ: 4-8, 12 và 42), bạn có thể làm:

$ 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

Trong awk, $1là trường đầu tiên, vì vậy lệnh này in tất cả các dòng có trường đầu tiên là i) trong khoảng từ 4 đến 8 (bao gồm) hoặc ii) 12 hoặc iii) 42.

Nếu bạn cũng muốn xóa trường được thêm bởi cat -nđể lấy các dòng gốc từ tệp, bạn có thể làm:

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.