15

次のような多数のエラー行を含むログ ファイルがあります。

Failed to add email@test.com to database

これらの行を 1 回の grep 呼び出しでフィルタリングできます。

grep -E 'Failed to add (.*) to database'

これは問題なく動作しますが、私が本当にやりたいのは、grep (または出力を渡す別の Unix コマンド) に、一致した行の電子メール アドレス部分のみを出力させることです。

これは可能ですか?

4

9 に答える 9

14

sedgrepなしで問題ありません:

sed -n 's/Failed to add \(.*\) to database/\1/p' filename
于 2009-06-10T10:33:48.043 に答える
5

sedを使用できます:

grep -E 'Failed to add (.*) to database'| sed 's/'Failed to add \(.*\) to database'/\1'
于 2009-06-10T10:24:49.887 に答える
5

GNU grep の最近のバージョンには、-oまさにあなたが望むことを行うオプションがあります。(-o--only-matching)。

于 2009-07-16T21:27:10.127 に答える
2

これは仕事をするはずです:

grep -x -e '(?<=Failed to add ).+?(?= to database)'

肯定的な先読みアサーションを使用し、その後に電子メール アドレスの一致が続き、その後に後読みアサーションが続きます。これにより、行全体と一致することが保証されますが、実際には電子メール アドレスの部分のみが使用されます (したがって、返されます)。

この-xオプションは、grep がテキスト全体ではなく行と一致する必要があることを指定します。

于 2009-06-10T10:34:46.513 に答える
1

またはパイソン:

cat file | python -c "import re, sys; print '\r\n'.join(re.findall('add (.*?) to', sys.stdin.read()))"
于 2009-06-10T10:29:13.140 に答える
-2

grepを使用する場合は、egrepを使用する方が適切です。

About egrep

Search a file for a pattern using full regular expressions.

grepは、正規表現の機能を常に備えているとは限りません。

于 2009-07-14T17:51:25.597 に答える