Grep список нескольких частей файла, соединенных с разрывом - PullRequest
0 голосов
/ 07 июня 2019

У меня есть команда псевдонима в моем bash_profile, чтобы перечислить все мои SSH-соединения в моем файле ~/.ssh/config.

Мой файл выглядит так

Host connection1
Hostname connection1.co.uk
User **user**
IdentityFile /Users/**user**/.ssh/id_rsa

Host connection2
Hostname connection2.co.uk
User **user**
IdentityFile /Users/**user**/.ssh/id_rsa

Моя командапросто запускает

cat ~/.ssh/config | grep Host[[:blank:]];

, который выводит результат наподобие

Host connection1
Host connection2

Как мне изменить мою команду, чтобы она печатала в следующем формате (включая разрывы)

Host connection1
Hostname connection1.co.uk

Host connection2
Hostname connection2.co.uk

Ответы [ 3 ]

2 голосов
/ 07 июня 2019

Просто используйте 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[]. Таким образом, даже если бы ваши строки были в другом порядке, остальная часть сценария все равно работала бы, поскольку вы не полагаетесь на порядок строк, а только имена и значения, установленные в каждой строке. Это делает любые другие запросы или действия, которые вам необходимо выполнить, чрезвычайно просто для написания кода и надежной и удобной работы.

1 голос
/ 07 июня 2019

Также ищите пустые строки

grep -E "^Host|^$" ~/.ssh/config

Объяснение:

Option -E: интерпретировать PATTERN как расширенное регулярное выражение.
^Host: String Host в начале строки
^$: ничего между началом и концом строки
a|b: соответствует a или соответствует b.

0 голосов
/ 07 июня 2019

Не искать пробелы,

т.е.

grep "^Host" ~/.ssh/config

^ указывает на начало поиска с начала строки. Звонок на cat бесполезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...