Grepは一致する行をGnuPG出力で一致するキーIDを返します


1

この入力がある:

rsa2048/C7927B82 2015-08-30
rsa2048/FB2D99F9 2015-08-30

grepがキーIDのみを返すようにしますC7927B92。例:。マッチの前後にGrep文字のパターンを使用しますか?、私は使用しました

grep -o -P 'rsa.{3,13}'

その結果

rsa2048/FB2D99F9

これをクリーンアップするにはどうすればよいですか?

重複する短いキーIDを見つけたい。次に、短いキーIDのgrepリストを取得し、次にソートして、sort |で重複をテストします。uniq -d。ただし、偽の複製が提供されるため機能しません。

gpg2 --list-keys | grep -o -P 'rsa.{3,13}' | sort | uniq -d
 rsa2048/2642B5CD
 rsa2048/DF6AA92A

回答:


2

正規表現の構文を誤解していました。rsa.{3,13}で始まり、任意の文字が3〜13回繰り返される文字列をgrepsしますrsa.正規表現のワイルドカード文字です)。

キーIDをgrepするには、一致グループを使用します。単一のgrepステートメントを使用してこれを行うことはできず、そのうち2つを使用するか、sedなどの別のツールに切り替えるか、問題を解決する他の方法を探す必要があります。-PPerlスタイルの正規表現に既に使用しているパラメーターをサポートするGNU grep を使用すると、lookaheadとlookbehindを使用して、目的の処理を実行できます。

echo 'rsa2048/2642B5CD' | grep -o -P '(?<=rsa2048/)[[:xdigit:]]{8}'

これは、目的の結果を達成するための1つの方法にすぎず、他にも多くの方法があります。上記のものはおそらく最もクリーンなものの1つであり、代わりにIDを単純にカットすることもできます。

echo 'rsa2048/2642B5CD' | grep -o -P 'rsa.{3,13}' | cut -d/ -f2

とにかく、スクリプトを作成するために、コロンで区切られた出力を使用する必要があります--with-colons。これははるかに優れた解析可能です。以下は、すべてのキーをリストし、次に^キーの有効性を気にせずに公開キー(を使用して各行の先頭から)をフィルタリングしますが、サイズ2048ビットのRSAキー(フィールド4、アルゴリズムID 1)をフィルタリングし、最終的にフィールドを切り取ります5、キーIDが含まれます。

gpg2 --with-colons --list-keys | grep '^pub:[[:alpha:]]:2048:1:' | cut -d: -f5

ありがとう、素晴らしいアイデア。FYI --with-colonsは、64ビットのキーIDを提供します。ソートの私の使用法です| uniq -d ok?
-StackAbstraction

を使用して何を達成しsort | uniq -dますか?「重複した短いキーIDを見つけたい」など、質問の重要な部分を投稿できなかったと思います。「質量の生成」に関する一部を削除しましたが、これは(まだ)関連性がないように思えますが、これ以上の説明はありませんし、質問もそのままです。
イェンスエラ

正しい重複した短いキーIDを見つけたいです。短いキーIDのgrepリストを取得し、次にソートして、uniq -dで重複をテストします。ただし、偽の複製が提供されるため機能しません。
StackAbstraction
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.