web-dev-qa-db-ja.com

grepを使用して2つの特定の単語/文字間の文字列を取得するパターン

次のような文字列からメールアドレスを抽出する必要があります(ログパーサーを作成しています):<some text> [email protected], <some text>

egrep(またはgrep -Eo)を使用します。したがって、文字列は"from="","の間でのみ抽出する必要があります。これは、to=etcのようなログの他の部分にも電子メールアドレスが含まれるためです。

13
Shirker

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]
30
anubhava

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
15
Shiplu Mokaddim

純粋な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/,*/}を実行できます(もちろん、データによって異なります)。
  • 参照: http://www.tldp.org/LDP/abs/html/parameter-substitution.html
8
michael