2つのgrepを1つにマージ

2つのgrepを1つにマージ

他のコマンドの出力からIDを抽出する必要があります。現在私の抽出コマンドは次のとおりです。

someID=$(command | grep -oP '(?:^Successfully\sbuilt\s)([\da-z]{12}$)' | grep -oP '([a-z\d]{12})')

コマンド出力の例:

 ---> Using cache
 ---> 9b4624927fa6
Successfully built 9b4624927fa6

予想される結果:

9b4624927fa6

行から抽出されたID

Successfully built 9b4624927fa6

この2つのgrepステートメントを1つにまとめるにはどうすればよいですか?

答え1

私の最初の作品を少し修正しましたgrep

$ grep -oP '^Successfully\sbuilt\s\K[\da-z]{12}$' example-output
9b4624927fa6

\KPCREからゲームをリセットして始めましょう:

エスケープシーケンスの\Kため、以前に一致した文字は最終一致シーケンスに含まれません。

幅0の肯定的な振り返りアサーションに似ています (?<=Successfully...

答え2

で始まる行末の16進数を取得するには、Successfully built次のようにしますsed

sed -n -E 's/^Successfully built ([[:xdigit:]]+)$/\1/p'

これにより、一致する行がハッシュに変わり、印刷されます(他の行は除く)。

またはawk:

awk '/^Successfully built [[:xdigit:]]+$/ { print $NF }'

これにより、正規表現に一致する各行の最後のスペースで区切られたフィールドが印刷されます。

両方の正規表現では、その式[[:xdigit:]]+は空でない16進文字列と一致します。

関連情報