Grep übereinstimmende Zeilen, aber passende Schlüssel-IDs in der GnuPG-Ausgabe zurückgeben

706
StackAbstraction

Mit dieser Eingabe:

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

Ich möchte grep nur die Schlüssel - ID zurückzukehren, zum Beispiel: C7927B92. Verwenden Sie das Muster aus Grep-Zeichen vor und nach dem Spiel? , Ich benutzte

grep -o -P 'rsa.' 

ergebend

rsa2048/FB2D99F9 

Wie räume ich das auf?

Ich möchte doppelte Kurzschlüssel-IDs finden. Als nächstes nehme ich die grep-Liste der Kurzschlüssel-IDs, sortiere dann und teste mit sort | auf Duplikate uniq -d. Es funktioniert jedoch nicht, da es falsche Duplikate liefert.

gpg2 --list-keys | grep -o -P 'rsa.' | sort | uniq -d rsa2048/2642B5CD rsa2048/DF6AA92A 
1

1 Antwort auf die Frage

2
Jens Erat

Sie haben die Syntax für reguläre Ausdrücke nicht richtig verstanden. rsa.greps für Zeichenfolgen, die mit beginnen rsa, gefolgt von 3 bis 13 Wiederholungen eines beliebigen Zeichens ( .ist das Platzhalterzeichen in regulären Ausdrücken).

Verwenden Sie Übereinstimmungsgruppen, um die Schlüssel-ID zu ermitteln. Sie können dies nicht mit einer einzigen grep-Anweisung tun, und Sie müssen entweder zwei von ihnen verwenden oder zu einem anderen Tool wechseln, z. B. sed, oder nach anderen Möglichkeiten suchen, um das Problem zu lösen. Mit GNU grep, das die -PParameter unterstützt, die Sie bereits für reguläre Ausdrücke im Perl-Stil verwendet haben, können Sie lookahead und lookbehind verwenden, um das zu erreichen, was Sie zu tun versuchen:

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

Dies ist nur ein Weg, um das gewünschte Ergebnis zu erzielen, und es gibt viele andere Möglichkeiten. Die oben genannte ist wahrscheinlich eine der saubersten, eine Alternative könnte das Abschneiden der ID sein:

echo 'rsa2048/2642B5CD' | grep -o -P 'rsa.' | cut -d/ -f2 

Jedenfalls sollten Sie sich für die --with-colonsSkripterstellung für die mit Doppelpunkt getrennte Ausgabe entscheiden, die viel besser analysiert werden kann. Im Folgenden werden alle Schlüssel aufgelistet und anschließend nach öffentlichen Schlüsseln (beginnend am Anfang jeder Zeile ^) gefiltert, ohne dass die Gültigkeit des Schlüssels beachtet wird. RSA-Schlüssel (Feld 4, Algorithmus-ID 1) der Größe 2048 Bit werden jedoch gefiltert und das Feld wird schließlich abgeschnitten 5, die die Schlüssel-ID enthält.

gpg2 --with-colons --list-keys | grep '^pub:[[:alpha:]]:2048:1:' | cut -d: -f5 
Danke, tolle Ideen. FYI --with-Doppelpunkte gibt 64-Bit-Schlüssel-IDs. ist meine Verwendung von sort | uniq -d ok StackAbstraction vor 8 Jahren 0
Was möchten Sie mit `sort | uniq -d`? Ich denke, Sie haben einen wichtigen Teil Ihrer Frage verpasst, z. B. "Ich möchte doppelte Kurzschlüssel-IDs finden". Ich habe einen Teil bezüglich "Massengenerierung" entfernt, der (noch) ohne weitere Erklärung irrelevant erscheint und für Ihre Frage, wie sie ist. Jens Erat vor 8 Jahren 0
Richtig Ich möchte doppelte Kurzschlüssel-IDs finden. also nehme ich die grep-liste der kurzen schlüssel-ids, sortiere dann und teste mit uniq -d nach Duplikaten. Es funktioniert jedoch nicht, da es falsche Duplikate liefert. StackAbstraction vor 8 Jahren 0