Grep kalıplarını bir dosyadan okumak


49

Birkaç büyük metin dosyam var ve dosyada başka bir dosyadan UNIQS.txtdizelerin bir listesi var grep. Kullandığım kod

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

hangi bir şey yapmaz - oluşturulan dosya boştur. Ama ne zaman yaparım

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

doğru çalışıyor. Bu beni şaşırtıyor çünkü grepgirişleri UNIQS.txttırnak işaretleri ve eğik çizgiler olmadan regexp desenleri olarak yorumlayamayacağımı sanıyordum (öyle değil). Genel olarak, eğer bir dosyadan kalıpları alıyorsanız, otomatik olarak regexp kalıpları olduğunu düşünecek mi?

Düzenleme: In UNIQS.txtdosyanın, formun satır ayrılmış dizeleri vardır

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

(şablon adları denir) ve dosya EEP_VSL...sekmesi sütunları ayırır, yaklaşık 14 sütun ve ilk sütun şablon adıdır, bu yüzden temelde dosyadaki her şablona karşılık gelen satırı çıkarmak istiyorum.

Yanıtlar:


60

-fSeçenek grep desenleri okuyan bir dosyayı belirtir. Bu, komut satırında desenlerin iletilmesi gibidir ( -ebirden fazla seçenek varsa), ancak bir kabuktan arama yaparken, içindeki özel karakterlerin kabuk tarafından genişletilmesini önlemek için kalıptan alıntı yapmanız gerekebilir.

Argüman -Eveya -Fveya -Pvarsa, Grep'e, hangi sözdiziminde kalıpların yazıldığını söyler. Argüman olmadan, grep temel düzenli ifadeler bekler ; -Egrep ile düzenli ifadelerin uzatılmasını bekler ; ile -P(destekleniyorsa), grep beklediği düzenli ifadeler Perl ; ve -Fgrep, değişmez dizgileri bekler. Desenlerin komut satırından mı yoksa bir dosyadan mı geldiği önemli değildir.

Dizelerin alt diziler olduğuna dikkat edin: a+bdesen olarak geçerseniz a+b+c, içeren bir çizgi eşleşir. Verilen dizelerden tam olarak birini içeren ve daha fazlasını içermeyen satırları aramak istiyorsanız, -xseçeneği işaretleyin.


1
Tamam, bu işe yarar teşekkürler. Diyelim ki dizeyle tam olarak eşleşmek istediğimi varsayalım, yani dizge 12345 ise, 123456 veya 123455 vb. İle yalnızca 12345 ile eşleşmesini istiyorum. Bunu nasıl yapabilirim?
sdf

2
@sdf Son paragrafımı oku:-x
Gilles 'SO- kötülük' dur

Bu çok eski, kazdığım için üzgünüm. Yukarıdaki açıklama müthiş olsa da, biraz muğlak neden dosyadan desenleri (dize) olmadan eşleşmiyor -Fbayrak. Tahminim -yukarıdaki örnek satırda bunun karakter dizisi olarak okunmasına neden olduğu yönünde mi? Bu da köşeli ayraç gerektirmez mi? Bazı örnek dosyalarla test ettim ama bir sonuca varmadım.
Haziran’daki

@trs Soruda gösterilen satır (cevabımı yayınladıktan sonra eklenmiş) regexps'te özel bir anlamı olan herhangi bir karakter içermiyor, bu yüzden aynı ve olmayan aynı şekilde davranıyor -F. Gibi karakterlerle bir fark yaratacaktır \[*^$.
Gilles 'SO- kötülük yapmayı bırak'

@Gilles teşekkürler, bu da benim izlenim oldu ama sdf bayraksız "oluşturulan dosyanın boş olduğunu" (okuyor: eşleşmiyor) iddia ediyor -F?
16'da

0

Aynı hatayı yaşadım, @gilles'in iyi cevabı ile çözülmedim. Giriş dosyasına daha yakından bakarak sonunda 2 yeni satır buldum. Bunlar olmadan, başarı, sadece gerekli: grep -i file_pattern_input file

(GNU grep 3.1, Girdi dosyası 5000'den fazla kayıt, eşleşen / kalıp dosyası 2536, tüm 2536'nın dosyada olması gerektiğini biliyordum. Yeni satırlarda dosyanın tüm satırlarını ve sadece 2536 eşleşen satırları almış)


1
Bu OP'nin sorunu ile ilgisi yok. Boş bir satır boş desen olarak grep tarafından okunur ve boş bir desen her yerde eşleşir.
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.