Unix'teki özel karakterler için grep


95

Birden çok satırda aşağıdaki normal ve özel karakter dizisini içerebilen bir günlük dosyam var (application.log)

*^%Q&$*&^@$&*!^@$*&^&^*&^&

Bu özel karakter dizesini içeren satır numaralarını aramak istiyorum.

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

Yukarıdaki komut herhangi bir sonuç döndürmez.

Satır numaralarını almak için doğru sözdizimi ne olmalıdır?


^@: ^ardından gelen @veya nul karakter anlamına gelir ?
Nahuel Fouilleul

Yanıtlar:


159

Seçeneği grepkullanarak -Fgirdinizi sabit dizge olarak ele almanızı söyleyin .

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

-nSatır numarasını almak için seçenek gereklidir,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

7
Yalnızca (ters eğik çizgi) kaçmaya gerek grep sürümünüzü bağlı ^, $, ., *ve \ . ya da sen de deneyebilirsin fgrep.
Nahuel Fouilleul

2
@NahuelFouilleul: +1. btw, fgrepile aynıdır grep -F.
Prince John Wesley

@PrinceJohnWesley: Bu aynıdır ancak bazı sistemlerde grep'in birçok sürümü vardır, bu nedenle fgrep kullanmak -F'yi destekleyen sürümü bulabilir
Nahuel Fouilleul

Ya kullanırsa egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
inckka

Çalışmıyor. grep -rinF '-static'baskılar Invalid option «t». @ Mani'nin cevabı işe yaradı , yani grep -rin "\-static".
Hi-Angel

93

Benim için işe yarayan şudur:

grep -e '->'

-E, sonraki argümanın kalıp olduğu ve bir argüman olarak yorumlanmayacağı anlamına gelir.

Gönderen: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/


str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... ama kazanmak -F yerine -e ÇALIŞMA olan - ''! Eğer anahtar işareti yanında yeterince özel karakterler vardı vermedi yaradığını dEĞİL ÇALIŞMA,
THESorcerer

1
Benim için çalışan tek şey, '\' veya -F veya fgrep bile çalışmıyor. Teşekkürler!
user180574

2
Kabul edilen cevap bu olmalı - basit ve grep için çalışıyor
Ishay Peled

1
Denenmiş -F ve fgrep, karakter dizisini içeren '-' karakterini aradığımda çalışmıyor. Bu çalışıyor.
世界 知名 伟人

Bu sorunun neden bu soruda bulunduğunu merak ediyorum ( şu anda görüntülediğim Soru-Cevap'a referans için stackoverflow.com/q/12387685 ) - muhtemelen başka bir sorudan birleştirilen yanlış bir cevap durumu? -
İle

6

İlgili bir not

Satır başı için grep, yani \rkarakter veya 0x0dbunu yapabiliriz:

grep -F $'\r' application.log

Alternatif olarak, printfveya echoPOSIX uyumluluğu için kullanın

grep -F "$(printf '\r')" application.log

Ve biz kullanabilir hexdumpveya lesshiç bakınız sonucu:

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

$'\r'Ve diğer desteklenen karakterlerin kullanımı ile ilgili olarak, Bash Kılavuzu> ANSI-C Alıntılarına bakınız :

$ 'Dizge' biçimindeki sözcükler özel olarak ele alınır. Kelime, ANSI C standardında belirtildiği gibi ters eğik çizgi kaçış karakterlerinin değiştirilmesiyle dizeye genişler


3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

2

Alfasayısal karakterleri ve boşlukları kaldırmayı deneyebilirsiniz. Ve sonra kullanmak -nsize satır numarasını verecektir. Aşağıdakileri deneyin:

grep -vn "^[a-zA-Z0-9 ]*$" application.log


Teşekkürler .. Bir dosyadan özel karakterleri bulmak benim için iyi çalışıyor.
Dipankar Nalui

-4

Vi'yi -b seçeneğiyle deneyin, bu özel satır sonu karakterlerini gösterecektir (genellikle bunu bir unix işletim sisteminde bir txt dosyasında Windows satır sonlarını görmek için kullanırım)

Ama betik bir çözüm istiyorsanız açıkça vi işe yaramayacaktır, böylece grep ile -f veya -e seçeneklerini deneyebilir ve sonucu sed veya awk'ye aktarabilirsiniz. Grep man sayfasından:

Eşleştirici Seçimi -E, --extended-regexp PATTERN'i genişletilmiş bir düzenli ifade olarak yorumlar (ERE, aşağıya bakın). (-E, POSIX tarafından belirtilir.)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  (-F is specified
          by POSIX.)

2
Bu, kabul edilmiş bir cevaptan ne şekilde daha iyidir, bu yüzden neredeyse 5 yıllık bir soruya eklediniz?
SergGr 21
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.