Просто используйте awk в режиме абзаца, где он обрабатывает каждый блок текста, разделенный пустыми строками, как запись, а затем каждую строку в этой записи как поле. Вам даже не нужно указывать его для поиска «Host», вы можете просто напечатать первые 2 строки каждого «абзаца»:
$ awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} {print $1, $2}' file
Host connection1
Hostname connection1.co.uk
Host connection2
Hostname connection2.co.uk
Посмотрите, что еще вы можете сделать с этим в качестве отправной точки:
$ awk '
BEGIN { RS=""; ORS="\n\n"; FS=OFS="\n" }
{
delete f
for(i=1;i<=NF;i++) {
tag = val = $i
sub(/[[:space:]].*/,"",tag)
sub(/^[^[:space:]]+[[:space:]]+/,"",val)
f[tag] = val
}
}
f["Hostname"] == "connection1.co.uk" {
print f["Host"], f["IdentityFile"]
}
' file
connection1
/Users/**user**/.ssh/id_rsa
Цикл создает массив f[]
, который отображает имена тегов, такие как "Host", на их значения, а затем в остальной части скрипта вы можете получить доступ к значениям по их именам в f[]
. Таким образом, даже если бы ваши строки были в другом порядке, остальная часть сценария все равно работала бы, поскольку вы не полагаетесь на порядок строк, а только имена и значения, установленные в каждой строке. Это делает любые другие запросы или действия, которые вам необходимо выполнить, чрезвычайно просто для написания кода и надежной и удобной работы.