Unixでの特殊文字のgrep


92

ログファイル(application.log)があり、次の通常および特殊文字の文字列が複数行に含まれている可能性があります。

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

この特殊文字列を含む行番号を検索したい。

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

上記のコマンドは結果を返しません。

行番号を取得するための正しい構文は何ですか?


^@:は^@またはヌル文字が後に続くことを意味しますか?
Nahuel Fouilleul 2012

回答:


154

教えてgrep使用して固定文字列としてあなたの入力を治療するための-Fオプションを選択します。

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

-n行番号を取得するにはオプションが必要です。

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

7
あなただけ(バックスラッシュ)エスケープする必要があるのgrepのバージョンに依存^$.*\ 。または、あなたも試すことができfgrepます。
Nahuel Fouilleul 2012

2
@NahuelFouilleul:+1。ところで、fgrepと同じgrep -Fです。
プリンスジョンウェスリー

@PrinceJohnWesley:同じですが、システムによってはgrepのバージョンが多いため、fgrepを使用すると-Fをサポートするバージョンが見つかる可能性があります
Nahuel Fouilleul

もし彼が使っegrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.logたら?
inckka 14

動作しません。grep -rinF '-static'プリントInvalid option «t»。@マニの答えはうまくいきました、すなわちgrep -rin "\-static"
Hi-Angel

89

私のために働いたものは:

grep -e '->'

-eは、次の引数がパターンであり、引数として解釈されないことを意味します。

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


str = '!"#$%&()* +、-。/:; <=>?@ [\] ^ _` {|}〜 '; echo "$ str" | grep -e "$ str" .....うまくいかない、あなたのために働いたものには、スイッチ記号「-」以外に十分な特殊文字がありませんでしたが、-eの代わりに-Fを
当てることができ

1
'\'または-Fまたはfgrepが機能しない場合でも、私にとっては機能するだけです。ありがとう!
user180574

2
これは受け入れられる答えである必要があります-シンプルでgrepで機能します
Ishay Peled

1
-Fを試したところ、「-」文字を含む文字列を検索するときにfgrepが機能しません。これは機能します。
世界知名伟人

なぜこの回答がこの質問にあるのか疑問に思っています(現在表示しているQ&Aを参照するには、stackoverflow.com / q / 12387685)-おそらく別の質問からマージされた回答の間違ったケース?で始まるパターンを検索する-には、stackoverflow.com
questions / 2427913 /…

6

関連メモ

キャリッジリターン、つまり\r文字、またはをgrep 0x0dするには、次のようにします。

grep -F $'\r' application.log

または、POSIX互換性のためにprintf、またはを使用しますecho

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

そして、私たちは使用することができます hexdumpしたり、結果less確認したり。

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

$'\r'とその他のサポートされている文字の使用については、Bashマニュアル> ANSI-C引用を参照してください。

$ 'string'形式の単語は特別に扱われます。単語は文字列に展開され、バックスラッシュでエスケープされた文字はANSI C標準で指定されているとおりに置き換えられます


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

2

英数字とスペースを削除してみてください。そして、使用する-nと行番号が表示されます。以下を試してください:

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


おかげで..ファイルから特殊文字を見つけるのはうまくいきます。
Dipankar Nalui

-4

-bオプションを指定してviを試してください。これにより、特殊な行末文字が表示されます(通常、これを使用して、UNIX OS上のtxtファイルでWindowsの行末を確認します)

しかし、スクリプトソリューションが必要な場合は明らかにviは機能しないため、grepで-fまたは-eオプションを試して、その結果をsedまたはawkにパイプできます。grep manページから:

マッチャー選択-E、-extended-regexp PATTERNを拡張正規表現として解釈します(ERE、以下を参照)。(-Eは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.)

2
これは受け入れられた回答よりも優れているため、ほぼ5年前の質問に追加しましたか?
SergGr 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.