Grep列出文件的多个部分,并以一个中断连接

时间:2019-06-07 13:43:19

标签: bash macos grep

我的bash_profile中有一个别名命令,用于在~/.ssh/config文件中列出我的所有ssh连接。

我的文件看起来像这样

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 个答案:

答案 0 :(得分:2)

只需在段落模式下使用awk,它将空白行分隔的每个文本块都视为一条记录,然后将该记录中的每一行都视为一个字段。您甚至不需要告诉它查找“主机”,您只需打印每个“段落”的前两行即可:

$ 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 :(得分:1)

还要寻找空行

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

说明:

Option -E:将PATTERN解释为扩展的正则表达式。
^Host:该行开头的字符串主机
^$:行首与行尾之间没有任何内容
a|b:匹配a或匹配b

答案 2 :(得分:0)

不要搜索空格,

grep "^Host" ~/.ssh/config

^指示从行的开头开始搜索。对cat的调用没有用。