grep untuk karakter khusus di Unix

95

Saya memiliki file log (application.log) yang mungkin berisi string karakter normal & khusus berikut pada beberapa baris:

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

Saya ingin mencari nomor baris yang berisi string karakter khusus ini.

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

Perintah di atas tidak mengembalikan hasil apa pun.

Apa sintaks yang benar untuk mendapatkan nomor baris?

Avinash Sonee
sumber
^@: artinya ^diikuti oleh @atau karakter nul?
Nahuel Fouilleul

Jawaban:

160

Katakan grepuntuk memperlakukan input Anda sebagai string tetap menggunakan -Fopsi.

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

Opsi -ndiperlukan untuk mendapatkan nomor baris,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Pangeran John Wesley
sumber
7
Tergantung versi grep Anda hanya perlu untuk melarikan diri (dengan garis miring terbalik) ^, $, ., *dan \ . atau Anda juga bisa mencobanya fgrep.
Nahuel Fouilleul
2
@NahuelFouilleul: +1. btw, fgrepsama seperti grep -F.
Pangeran John Wesley
@PrinceJohnWesley: ini sama tetapi pada beberapa sistem ada banyak versi grep jadi menggunakan fgrep mungkin menemukan versi yang mendukung -F
Nahuel Fouilleul
Bagaimana jika dia menggunakan egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
inckka
Tidak berhasil. grep -rinF '-static'cetakan Invalid option «t». Jawaban @ Mani berhasil , yaitu grep -rin "\-static".
Hi-Angel
95

Yang berhasil untuk saya adalah:

grep -e '->'

-E berarti argumen berikutnya adalah pola, dan tidak akan ditafsirkan sebagai argumen.

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

Tom Brito
sumber
str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... TIDAK BEKERJA, apa yang berhasil untuk Anda tidak memiliki cukup karakter khusus selain tanda sakelar '-', tetapi win -F bukannya -e BEKERJA!
THESorcerer
1
Satu-satunya hal yang berhasil untuk saya, bahkan '\' atau -F atau fgrep tidak berfungsi. Terima kasih!
pengguna180574
2
Ini harus menjadi jawaban yang diterima - sederhana dan bekerja untuk grep
Ishay Peled
1
Mencoba -F dan fgrep tidak bekerja untuk saya saat mencari string termasuk '-' char. Ini bekerja.
世界 知名 伟人
Saya bertanya-tanya mengapa jawaban ini ada dalam pertanyaan ini ( stackoverflow.com/q/12387685 untuk referensi ke Tanya Jawab yang saya lihat saat ini) - mungkin kasus jawaban yang salah digabungkan dari pertanyaan lain? Untuk mencari pola yang dimulai dengan -, lihat juga stackoverflow.com/questions/2427913/…
Sundeep
6

Catatan terkait

Untuk grep untuk carriage return, yaitu \rkarakter, atau 0x0d, kita bisa melakukan ini:

grep -F $'\r' application.log

Cara lainnya, gunakan printf, atau echo, untuk kompatibilitas POSIX

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

Dan kita bisa menggunakan hexdump, atau lessuntuk melihat hasilnya:

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

Mengenai penggunaan $'\r'dan karakter lain yang didukung, lihat Bash Manual> ANSI-C Quoting :

Kata-kata dalam bentuk $ 'string' diperlakukan secara khusus. Kata tersebut diperluas menjadi string, dengan karakter pelolosan garis miring terbalik diganti seperti yang ditentukan oleh standar ANSI C.

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

Anda dapat mencoba menghapus karakter alfanumerik dan spasi. Dan kemudian gunakan -nakan memberi Anda nomor baris. Coba ikuti:

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

R. Kumar
sumber
Terima kasih .. Saya bekerja dengan baik untuk menemukan karakter khusus dari sebuah file.
Dipankar Nalui
-4

Coba vi dengan opsi -b, ini akan menampilkan karakter akhir baris khusus (saya biasanya menggunakannya untuk melihat akhiran baris windows dalam file txt pada OS unix)

Tetapi jika Anda menginginkan solusi dengan skrip jelas vi tidak akan berfungsi sehingga Anda dapat mencoba opsi -f atau -e dengan grep dan menyalurkan hasilnya ke sed atau awk. Dari halaman manual grep:

Matcher Selection -E, --extended-regexp Tafsirkan POLA sebagai ekspresi reguler yang diperluas (ERE, lihat di bawah). (-E ditentukan oleh POSIX.)

   -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.)
pengguna7648830
sumber
2
Dalam hal apa ini lebih baik daripada jawaban yang diterima sehingga Anda menambahkannya ke pertanyaan berusia hampir 5 tahun?
SergGr