「grep」を使ってgpgキーフィンガープリント値を取得するには?

「grep」を使ってgpgキーフィンガープリント値を取得するには?

出力gpg --list-secret-keys --keyid-format=long

pub   rsa3072 2023-01-13 [SC] [expires: 2025-01-12]
  D8524A558964E86Cxxxx93111270xxxxxxxx7A74
uid           [ultimate] demo(demo) <demo>
sub   rsa3072 2023-01-13 [E] [expires: 2025-01-12]

出力から「D8524A558964E86Cxxxx93111270xxxxxxxx7A74」のみをgrepするにはどうすればよいですか?私はLinuxを使用しています。

答え1

マニュアルページから:

スクリプトや他のプログラムでこのコマンドの出力を使用しないでください。出力は人が使用するためのものであり、形式は異なる場合があります。 --with-colonsオプションは、スクリプトや他のプログラムで利用可能な安定した機械分析が可能な形式で出力をエクスポートします。

--with-colons
コロンで区切られたキーのリストを印刷します。 --display-charset 設定に関係なく、出力は UTF-8 でエンコードされます。この形式はコンピュータで簡単に解析できるため、スクリプトや他のプログラムからGnuPGを呼び出すときに便利です。この形式の詳細は、GnuPGソースディストリビューションに含まれている「doc / DETAILS」ファイルに文書化されています。

doc/DETAILS最新情報を見つけることができますそこ例えば。

だから:

gpg --list-secret-keys --with-colons |
  awk -F: '$1 == "fpr" || $1 == "fp2" {print $10}'

そこにリストされているすべてのキーの指紋を印刷します。

--keyid-formatお好みの指紋なので関係ありません。)

答え2

(非常に科学的ではありませんが)1つの解決策はコマンドを実行します大きな馬(20文字以上)

gpg...... | grep -Po '\w{20,}'

答え3

探している値が常に2番目の行にある場合は、次のように使用できます。

gpg --list-secret-keys --keyid-format=long | sed '2!d' | tr -d " "

答え4

16進数のみを含む40文字の単語のすべての項目を取得しようとすることができます。それほど科学的ではありませんが、問題を解決します。

gpg --list-secret-keys --keyid-format=long \
| grep --only-matching --extended-regexp "[[:xdigit:]]{40}"

関連情報