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?

Jawaban:


175

Keajaiban pipa;

head -10 log.txt | grep <whatever>

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

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.


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.


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



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

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.

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


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)


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".


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.

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.