Dengan perintah "cat" Linux, bagaimana saya hanya menampilkan baris tertentu dengan angka


59

Jika saya gunakan cat -n text.txtuntuk secara otomatis memberi nomor pada baris, bagaimana saya kemudian menggunakan perintah untuk menunjukkan hanya nomor baris tertentu.


1
Apa yang Anda maksud dengan "hanya tampilkan garis bernomor tertentu", dapatkah Anda memberikan hasil yang diharapkan?
tachomi

1
Mungkin ada sejuta cara untuk melakukan ini. tail+ headjuga dapat melakukan ini, seperti halnyaawk
Bratchley

Jawaban:


120

Menggunakan sed

Pemakaian

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

Untuk mencetak satu baris (5)

$ sed -n 5p file
Line 5

Untuk mencetak beberapa baris (5 & 8)

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

Untuk mencetak rentang tertentu (5 - 8)

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

Untuk mencetak rentang dengan garis tertentu lainnya (5 - 8 & 10)

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

27

Salah satu cara melakukannya adalah dengan menggunakan sed:

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

di mana 11 adalah jumlah baris yang ingin Anda hapus.

Atau untuk menghapus semua kecuali 11:

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

Kisaran juga dimungkinkan:

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

Dan cat -nbahkan tidak dibutuhkan:

sed '9,12!d' text.txt

9

Anda dapat menggunakan awk langsung ke atas.

awk 'NR==1' file.txt

mengganti '1' dengan nomor baris yang diinginkan.


1
Ini adalah sejuta mil jawaban terbaik di sini dan layak mendapatkan lebih banyak cinta daripada yang ada.
Wren

8

Tergantung pada tujuan saya suka kepala atau grep

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

akan mengembalikan garis 41 hingga 50.

atau

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

akan menampilkan baris 40 hingga 60. Masalahnya dengan metode grep adalah Anda harus menggunakan akun untuk mengisi nomor baris (perhatikan spasi)

Keduanya cukup berguna untuk parsing file log.


Misalnya tidak perlu catmeskipun
roaima

1
baik ya ... tapi .... tapi ... ..... Ada cara yang lebih baik. Namun, pertanyaannya tentang menggunakan kucing, jadi saya menggunakannya.
coteyr

cattidak dapat melakukan apa yang diinginkan OP
roaima

2

Seperti yang orang lain tunjukkan kepada Anda, tidak perlu digunakan cat -n. Program lain akan melakukannya untuk Anda. Namun, jika Anda benar-benar perlu mem-parsing output cat -ndan hanya menampilkan garis-garis tertentu (misalnya, 4-8, 12 dan 42), Anda bisa melakukan:

$ 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

In awk, $1adalah bidang pertama, jadi perintah ini mencetak semua baris yang bidang pertamanya adalah i) antara 4 dan 8 (inklusif) atau ii) 12 atau iii) 42.

Jika Anda juga ingin menghapus bidang yang ditambahkan oleh cat -nuntuk mendapatkan baris asli dari file, Anda dapat melakukan:

$ 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.