我的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
答案 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
的调用没有用。