Оберіть відповідні рядки, але поверніть відповідні ідентифікатори ключів у висновку GnuPG


1

Маючи цей вхід:

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

Я хочу Grep тільки повернути ідентифікатор ключа, наприклад: C7927B92. Використовуючи візерунок із символів Grep до та після матчу? , Я використав

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

в результаті чого

rsa2048/FB2D99F9

Як це почистити?

Я хочу знайти дублікати коротких ідентифікаторів ключів. Далі я беру греп-список коротких ідентифікаторів ключів, а потім сортую і тестую на дублікати з сортуванням | uniq -d. Однак це не працює, оскільки надає помилкові дублікати.

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

Відповіді:


2

Ви неправильно зрозуміли синтаксис регулярного вираження. rsa.{3,13}підказки для рядків, починаючи з цього rsa, після чого слід від 3 до 13 повторів будь-якого символу ( .є символом підстановки у регулярних виразах).

Для отримання ідентифікатора ключа використовуйте групи відповідності. Ви не можете зробити це за допомогою одного оператора grep, або потрібно використовувати два з них або перейти на інший інструмент, наприклад sed, або шукати інші способи вирішення проблеми. Використовуючи GNU grep, який підтримує -Pпараметр, який ви вже використовували для регулярних виразів стилю perl, ви можете використовувати lookahead та lookbehind для досягнення того, що ви намагаєтеся зробити:

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

Це лише один спосіб досягти бажаного результату, і існує безліч інших можливих способів. Наведене вище, мабуть, одне з найчистіших, альтернативою може бути просто вирізання ідентифікатора:

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

У будь-якому випадку, для створення сценаріїв ви повинні --with-colonsвирішити відокремлену товсту кишку, досягнуту за допомогою , що набагато краще проаналізувати. Далі перелічені всі ключі, а потім фільтри для відкритих ключів (починаючи з початку кожного рядка з використанням ^), не піклуючись про дійсність ключа, але фільтруючи ключі RSA (поле 4, ідентифікатор алгоритму 1) розміром 2048 біт і, нарешті, вирізаємо поле 5, який містить ідентифікатор ключа.

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

спасибі, чудові ідеї. FYI - з двокрапками дає 64-бітові ключові ідентифікатори. це моє використання роду | uniq -d добре?
StackAbstraction

Чого ви хочете досягти, використовуючи sort | uniq -d? Я думаю, що ви пропустили повідомлення про важливу частину свого питання, наприклад "Я хочу знайти копії коротких ідентифікаторів ключів". Я видалив частину щодо "масового покоління", яка (як і раніше) здається неактуальною без додаткових пояснень і для вашого питання як є.
Єнс Ерат

Правильно Хочу знайти дублікати коротких ідентифікаторів ключів. тому я беру греп-список коротких ідентифікаторів ключів, а потім сортую і тестую на дублікати з uniq -d. Однак це не працює, оскільки надає помилкові дублікати.
StackAbstraction
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.