Есть ли однострочная команда для печати самой длинной строки в файлах в каталоге?

Обратите внимание на сообщение об ошибке: в нем не говорится, что секретный ключ отсутствует (это не так), а говорится, что отсутствует открытый ключ.

gpg: key 71980D35: секретный ключ без открытого ключа - пропущено

В RSA некоторые числа (d, p, q, u) являются частными, а другие (n, e) открытыми. Только 2 общедоступных номера необходимы для шифрования и проверки подписи, тогда как все 6 номеров необходимы для расшифровки и подписи. Таким образом, для последних операций вам действительно понадобятся как секретный, так и открытый ключи.

Открытый ключ был удален из публикации случайно?

Вы можете попробовать повторно импортировать открытый ключ. Поскольку открытый ключ является широко распространенным, его должно быть легко получить повторно.

4
24.09.2017, 05:11
4 ответа

Я считаю, что следующий -вкладыш должен работать:

L=`grep -h "ER" * | grep -v Cheese | wc -L`; grep -h "ER" * | grep -v Cheese | grep -P ".{$L}"

Первая команда находит все строки в файлах в каталоге, содержащем «ER» (вам нужна только опция -R, если у вас есть подкаталоги, иначе глобус *— это все, что вам нужно ), удаляет строки с помощью Cheese, а затем находит самую длинную из этих строк с помощью команды wc -L.

Вторая команда (увы )снова выполняет поиск соответствующих строк, но затем ищет строки максимальной длины. Вам может не понадобиться опция -Pдля grep, в зависимости от вашей версии grep.

3
27.01.2020, 20:44

Вот awk-решение:

 awk '/ER/ && !/Cheese/ {if (length($0) > maxlen) { maxline=$0; maxlen=length($0);}} END {print maxlen, maxline;}' *

(он также печатает длину самой длинной строки, но если вы этого не хотите, просто скажите ... END {print maxline;}.

Преимущество решения Джереми Довера над grep в том, что оно выполняет один проход по входным данным. Недостатком является то, что если есть несколько строк с одинаковой максимальной длиной, печатается только первая (или последняя, ​​если вы используете >= для сравнения длин ); решение grep печатает их все.

13
27.01.2020, 20:44

Эта строка сделает то, что вы просите (для файлов в одном каталоге):

awk '{l=length($0)}/ER/&&!/Cheese/&&(length($0)>l){l=length($0);line=$0}END{print(line)}' *

Если есть несколько совпадающих строк, будет напечатана только первая строка, которая содержит ER, а не Cheese и длиннее, чем ранее выбранная строка.

Кроме того, это будет сканировать файлы в pwd (*). Если вам нужна рекурсия, файлы нужно будет выбирать с помощью команды find.

find. -type f -iname '*.sh' -exec sh -c 'awk '\''{l=length($0)}/ER/&&!/Cheese/&&(l>lm){lm=l;li=$0}END{print(li)}'\'' "$@"' awksh {} +

Или в несколько строк (для удобства чтения):

find. -type f -iname '*.sh' -exec sh -c '\
awk '\''{l=length($0)}/ER/&&!/Cheese/&&(l>lm){lm=l;li=$0}END{print(li)}'\'\
' "$@"' awksh {} +
6
27.01.2020, 20:44

Тот, который добавляет длину строки в начало, выполняет численную сортировку и печатает второе поле первого результата, чтобы вернуть исходную строку.

 grep -h ER * | grep -v Cheese | awk '{ print length($0) " " $0}' | sort -nr| head -1| awk '{print $2}'    

Этот подход позволяет выполнять более сложные запросы, чем «MAX» или «MIN», если вам это нужно. Обратите внимание на использование AWK. Это именно то, для чего он действительно хорош.

2
27.01.2020, 20:44

Теги

Похожие вопросы