次のような文字列からメールアドレスを抽出する必要があります(ログパーサーを作成しています):<some text> [email protected], <some text>
egrep
(またはgrep -Eo
)を使用します。したがって、文字列は"from="
と","
の間でのみ抽出する必要があります。これは、to=
やetc
のようなログの他の部分にも電子メールアドレスが含まれるためです。
grep -oP
の使用:
s='<some text> [email protected], <some text>'
grep -oP '(?<=from=).*?(?=,)' <<< "$s"
[email protected]
または、\K
を使用してlookbehind
を回避します。
grep -oP 'from=\K.*?(?=,)' <<< "$s"
[email protected]
grep
が-P
(PCRE)をサポートしていない場合は、このsedを使用します。
sed 's/.*from=\(.*\),.*/\1/' <<< "$s"
[email protected]
awk
をお試しください
echo '<text> [email protected], <text>' | awk -F[=,] '{print $2}'
ここに $2
は、その位置に基づいて異なる番号にすることができます。
記号「(」、「)」の間のWordのサンプル:
echo "Linux Foundation Certified Engineer (LFCE-JP)" | awk -F[\(\)] '{print $2}'
LFCE-JP
純粋なbashソリューションでは、プレフィックスとサフィックスを別々に削除するために2つの手順が必要です(ただし、サブプロセスがないため、おそらくより高速に実行されます)。
#!/bin/bash
orig='[email protected], <some text>'
one=${orig#*from=}
two=${one%,*}
printf "Result:\n"
printf "$orig\n"
printf "$one\n"
printf "$two\n"
出力:
Result:
[email protected], <some text>
[email protected], <some text>
[email protected]
ノート:
${var#*pattern}
#
を使用すると、$var
の最初からpattern
までが削除されます${var%pattern*}
を使用すると%
が$var
の末尾から削除され、最大pattern
${var/pattern/replace}
でも同様に実現できます(そしてreplace
を空白のままにする)が、完全な正規表現がサポートされていない(つまり、^
または '$'を使用できない)ので、よりトリッキーです。したがって(たとえば)/^from=//
は実行できませんが、ステップ1で${var/*from=/}
を実行し、次にステップ2で${var/,*/}
を実行できます(もちろん、データによって異なります)。