Bisakah saya grep hanya n baris pertama dari file?

126

Saya memiliki file log yang sangat panjang, apakah mungkin meminta grep untuk hanya mencari 10 baris pertama?

David LeBauer
sumber

Jawaban:

175

Keajaiban pipa;

head -10 log.txt | grep <whatever>
Joachim Isaksson
sumber
13
Anda juga dapat menyalurkan aliran sewenang-wenang ke head:someCmd | head -10
Stuart Nelson
1
Head default untuk mencetak 10 baris pertama ke output standar, jadi ini berlaku untuk 10 barishead log.txt | grep <whatever>
Zlemini
5
Apakah ada cara untuk melakukan ini saat menggunakan -lopsi grep ? Saya ingin membuat daftar semua file yang terdiri dari 5 karakter pertama RIFFD.
James M. Lay
49

Untuk orang-orang yang menemukan ini di Google, saya perlu mencari nbaris pertama dari beberapa file, tetapi hanya mencetak nama file yang cocok. Saya dulu

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

Itu FNR..nextfile berhenti memproses file sekali 10 baris telah terlihat. The //..{}cetakan nama file dan bergerak pada setiap kali pertandingan pertama dalam file yang diberikan menunjukkan up. Untuk mengutip nama file untuk kepentingan program lain, gunakan

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
cxw
sumber
9
Saya adalah salah satu orang yang menemukan ini di Google. Terima kasih!
Floris
bagi saya, kode ini mencetak jalur lengkap file. Itulah yang saya butuhkan. Juga FNR=1hanya akan mencari baris pertama. Terima kasih!
Brian W
2
Untuk melakukan ini secara rekursif melalui direktori:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog
1
Terima kasih @OrangeDog. Satu koreksi kecil: seharusnya-type f
David Siegal
26

Atau gunakan awkuntuk satu proses tanpa |:

awk '/your_regexp/ && NR < 11' INPUTFILE

Di setiap baris, jika your_regexp cocok, dan jumlah record (baris) kurang dari 11, itu mengeksekusi tindakan default (yang mencetak baris input).

Atau gunakan sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

Memeriksa regexp Anda dan mencetak baris ( -nartinya jangan mencetak input, yang sebaliknya default), dan berhenti tepat setelah baris ke-10.

Zsolt Botykai
sumber
1
Mengapa tidak berhenti pada tanggal 10? (lihat solusi sed)
potong
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile- lebih cepat.
1
@potong Anda benar, dikoreksi. @srikanthradix sementara itu bisa lebih cepat solusinya Anda tidak mencari regexps tetapi hanya untuk string tetap. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfiletidak.
Zsolt Botykai
4
Ditambah gayanya tidak awkish. 2xifsdan 1xelsedalam perintah yang tidak membutuhkan pernyataan tindakan akan menjadi aho. weinberger dan kernighan menangis ...
jaypal singh
1
Menurut saya, daripada NR akan lebih baik menggunakan FNR, karena jika Anda menggunakan awk dengan banyak file FNR dimulai dari 0 untuk setiap file.
Vladyslav Savchenko
9

Anda memiliki beberapa opsi menggunakan program bersama grep. Yang paling sederhana menurut saya adalah menggunakan head:

head -n10 filename | grep ...

headakan menampilkan 10 baris pertama (menggunakan -nopsi), dan kemudian Anda dapat menyalurkan output itu ke grep.

Dan Fego
sumber
6
Saya bahkan tidak menyadari, semua solusi yang headdigunakan di sini telah digunakan -n 10 (termasuk saya) tanpa menyadari bahwa headsecara default hanya menampilkan 10 baris . :)
jaypal singh
4
grep "pattern" <(head -n 10 filename)
jaypal singh
sumber
3

Anda dapat menggunakan baris berikut:

head -n 10 /path/to/file | grep [...]
Gustavo Straube
sumber
3

Output dari head -10 filedapat disalurkan grepuntuk mencapai ini:

head -10 file | grep 

Menggunakan Perl:

perl -ne 'last if $. > 10; print if /pattern/' file
Alan Haggai Alavi
sumber
3
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: cetak dua baris sebelum pola.

-B 2: mencetak dua baris setelah pola.

head -10 log.txt # read the first 10 lines of the file.
vins
sumber
1
Jika saya ingat, -C 2akan melakukan hal yang sama seperti-A 2 -B 2
David LeBauer
3
grep -m6 "string" cov.txt

Ini hanya mencari 6 baris pertama string

Dileepa Chandima
sumber
3
Tidak, ini akan memberi Anda 6 kemunculan pertama "string" di seluruh file cov.txt
franzisk
2

Perpanjangan dari jawaban Joachim Isaksson: Cukup sering saya membutuhkan sesuatu dari tengah-tengah file yang panjang, misalnya baris 5001 hingga 5020, dalam hal ini Anda dapat menggabungkan headdengan tail:

head -5020 file.txt | tail -20 | grep x

Ini mendapatkan 5020 baris pertama, lalu hanya menampilkan 20 baris terakhir, lalu menyalurkan semuanya ke grep.

(Diedit: kesalahan fencepost di nomor contoh saya, menambahkan pipa ke grep)

RoG
sumber
1

grep -A 10 <Pola>

Ini untuk mengambil pola dan 10 baris berikutnya setelah pola. Ini akan bekerja dengan baik hanya untuk pola yang diketahui, jika Anda tidak memiliki pola yang diketahui, gunakan saran "kepala".

puncak salju
sumber
1
Meski mungkin benar. tambahkan lebih banyak uraian pertanyaan agar jawaban lebih lengkap.
Pramod S. Nikam
3
Ini menjawab pertanyaan yang sama sekali berbeda dan tidak berguna dalam konteks ini.
Pre101
-1

Saya memiliki masalah serupa dan semua masalah di atas tidak menyelesaikannya sepenuhnya. Saya juga tertarik untuk mendapatkan nama file yang berisi baris yang cocok. Solusi saya:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

NB: Pola dalam kasus saya selalu cocok dengan baris pertama.

Shokrof
sumber