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.
tail
+ head
cũng có thể làm điều này, như có thểawk
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.
tail
+ head
cũng có thể làm điều này, như có thểawk
Câu trả lời:
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
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ý.
cat
dù
cat
không thể làm những gì OP muốn
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 -n
và 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
, $1
là 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