Тот же подход, что и в ответе Стивена Китта , но без дополнительной seq
переменной. Вместо этого порядковый «номер» используется, чтобы определить, принадлежит ли текущая строка к набору, который мы ищем.
awk '{
if ($1=="TYR") {
i=$2 # remember index
}
else if (i!=0) {
if ($2==i+1 && $1=="LYS" || $2==i+2 && $1=="SER" || $2==i+3 && $1=="ALA") {
if ($2==i+3) { # are we there yet?
print i; exit
}
}
else {
i=0 # nope, reset index
}
}
}' file
(Ненужные фигурные скобки и отступ оставлены для удобства чтения)
Я могу помочь вам найти решение, предполагая использование gpg2, но с оговоркой, что я не претендую на безопасность и т. д.
Предварительно -создайте терминал, зарезервированный для ввода паролей. В нем дайте две команды:
tty
gpg-agent --pinentry-program /usr/bin/pinentry-curses --daemon sleep 999999
Это напечатает используемый pty, скажем, /dev/pts/10
, а затем запустит агент gpg, который будет "зависать" в sleep
, так что в этом терминале больше не будет выполняться чтение.
Когда вам нужно что-то расшифровать в какой-то другой оболочке, сначала установите ее окружение с помощью:
export GPG_TTY=/dev/pts/10
export GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
где 1000 — ваш идентификатор пользователя. (Вы можете получить имя этого сокета, запустив gpg-agent
с опцией -v
. Я уверен, что есть более чистый способ получить его.)
Обратите внимание на :0:1
, добавленное в конце информации; это действительно должен быть pid агента и версия протокола, но 0, похоже, принимается. (Если сокет не находится по указанному выше пути, возможно, вы не используете gpg2
или в ваших конфигурационных файлах установлены некоторые параметры ).
Теперь вы должны также добавить параметр --use-agent
в команду gpg
расшифровки. Это должно вызвать появление curses-версии программы pinentry в предварительно созданном -терминале, где теперь вы можете ввести пароль.