Membaca pola grep dari file

49

Saya memiliki beberapa file teks besar dan dalam file UNIQS.txtsaya memiliki daftar string grepdari file lain. Kode yang saya gunakan adalah

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

yang tidak melakukan apa-apa - file yang dihasilkan kosong. Tetapi ketika saya melakukannya

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

ini bekerja dengan benar. Ini membingungkan saya karena saya tidak berpikir grepakan menafsirkan entri UNIQS.txtsebagai pola regexp tanpa tanda kutip dan garis miring dan seterusnya berada di file (yang tidak ada). Apakah ini terjadi secara umum bahwa jika Anda mendapatkan pola dari file maka secara otomatis akan berpikir bahwa mereka adalah pola regexp?

Sunting: Di UNIQS.txtfile, ada string yang dipisahkan baris baru dari formulir

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(disebut nama templat) dan EEP_VSL...tab file dipisahkan kolom, dengan sekitar 14 kolom dan kolom pertama adalah nama templat, jadi pada dasarnya saya ingin mengekstrak baris yang sesuai dengan setiap templat dalam file.

sdf
sumber

Jawaban:

60

The -fpilihan menentukan file mana grep membaca pola. Itu sama seperti melewatkan pola pada baris perintah (dengan -eopsi jika ada lebih dari satu), kecuali bahwa ketika Anda menelepon dari shell, Anda mungkin perlu mengutip pola untuk melindungi karakter khusus di dalamnya agar tidak diperluas oleh shell.

Argumen -Eatau -Fatau -P, jika ada, memberi tahu grep sintaksis pola mana yang ditulis. Tanpa argumen, grep mengharapkan ekspresi reguler dasar ; dengan -E, grep mengharapkan ekspresi reguler yang diperluas ; dengan -P(jika didukung), grep mengharapkan ekspresi reguler Perl ; dan dengan -F, grep mengharapkan string literal. Apakah pola berasal dari baris perintah atau dari file tidak masalah.

Perhatikan bahwa string adalah substring: jika Anda lulus a+bsebagai pola maka garis yang mengandung a+b+ccocok. Jika Anda ingin mencari baris yang berisi persis salah satu string yang disediakan dan tidak lebih, maka lewat -xopsi.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Oke, itu berguna, terima kasih. Dapatkah saya bertanya, misalkan saya ingin mencocokkan string secara tepat, yaitu jika string 12345 maka saya ingin mencocokkannya pada 12345 saja, bukan pada 123456 atau 123455 dll., Bagaimana saya bisa melakukan ini?
sdf
2
@ PDF Baca paragraf terakhir saya:-x
Gilles 'SO- stop being evil'
Ini sudah sangat tua, maaf sudah menggali. Walaupun penjelasan di atas mengagumkan, agak kabur mengapa pola (string) dari file tidak cocok tanpa -Ftanda. Tebakan saya adalah -pada baris contoh di atas menyebabkan ini dibaca sebagai urutan karakter? Bukankah itu membutuhkan tanda kurung siku juga? Saya sudah menguji dengan beberapa file sampel tetapi belum sampai pada kesimpulan.
trs
@trs Baris yang ditunjukkan dalam pertanyaan (yang ditambahkan setelah saya memposting jawaban saya) tidak mengandung karakter yang memiliki arti khusus dalam regexps, sehingga berperilaku sama dengan dan tanpa -F. Itu akan membuat perbedaan dengan karakter seperti \[*^$.
Gilles 'SO- stop being evil'
@Gilles terima kasih, itu juga kesan saya tetapi @sdf mengklaim "file yang dihasilkan kosong" (baca: tidak ada yang cocok) tanpa -Ftanda?
trs
0

Saya memiliki kesalahan yang sama, tidak diselesaikan dengan jawaban yang bagus dari @gilles. Melihat lebih dekat pada file input, saya menemukan 2 baris baru di akhir. Tanpa ini, sukses, hanya diperlukan: grep -i file_pattern_input file

(GNU grep 3.1, Input file lebih dari 5000 catatan, file pencocokan / pola 2536, saya tahu semua 2536 harus ada dalam file. Dengan baris baru mendapatkan semua baris file dan tanpa hanya baris pencocokan 2536)

th_k
sumber
1
Itu tidak terkait dengan masalah OP. Baris kosong dibaca oleh grep sebagai pola kosong, dan pola kosong cocok di mana-mana.
muru