首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从~/..ssh/config-使用或不带尾连字符打印别名

从~/..ssh/config-使用或不带尾连字符打印别名
EN

Stack Overflow用户
提问于 2022-01-10 04:26:54
回答 5查看 114关注 0票数 1

我有以下文件,它是ssh的配置文件。

代码语言:javascript
复制
Host vps2 # Linode
    HostName xxx.xx.xx.xxx
    User foo_user

Host vps3 # Vultr
    HostName xxx.xx.xx.xxx
    User foo_user   

Host vps4
    HostName xxx.xx.xx.xxx
    User foo_user

Host vps5
    HostName xxx.xx.xx.xxx
    User foo_user 

Host vps6
    HostName xxx.xx.xx.xxx
    User foo_user 

Host vps7 # DigitalOcean
    HostName xxx.xx.xx.xxx
    User foo_user

Host vps8 # GCP
    HostName xxx.xx.xx.xxx
    User foo_user   

Host pi
   HostName xxx.xx.xx.xxx
   User pi

# OLD SHALL NOT BE USED

Host vps13
    HostName xxx.xx.xx.xxx
    User foo_user

Host vps14-old
   HostName xxx.xx.xx.xxx
   User foo_user 

Host vps4-old
    HostName xxx.xx.xx.xxx
    User foo_user 

Host vps15-old
   HostName xxx.xx.xx.xxx
   User foo_user 

Host vps11-old
    HostName xxx.xx.xx.xxx
    User foo_user

我需要打印以vps*开头的别名,下面(复制的)代码段就是这样做的。

代码语言:javascript
复制
$ awk '{for(i=1;i<=NF;i++){if($i~/^vps/){print $i}}}' $HOME/.ssh/config
vps2
vps3
vps4
vps5
vps6
vps7
vps8
vps3-old
vps4-old
vps5-old
vps11-old

现在,我想打印所有没有-old后缀的别名,添加| grep -v old工作。

代码语言:javascript
复制
$ awk '{for(i=1;i<=NF;i++){if($i~/^vps/){print $i}}}' $HOME/.ssh/config | grep -v "old"
vps2
vps3
vps4
vps5
vps6
vps7
vps8

有没有更干净的方法?最好只使用一个工具,我试着使用awk命令,但没有结果。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-01-10 04:48:42

可以将$i!~/-old$/条件添加到awk命令中:

代码语言:javascript
复制
awk '{for(i=1;i<=NF;i++){if($i~/^vps/ && $i!~/-old$/){print $i}}}' ~/.ssh/config

(注意:我更喜欢~而不是$HOME,因为它不是双引号,只是为了防止路径中出现奇怪的字符。)

票数 2
EN

Stack Overflow用户

发布于 2022-01-10 04:47:22

您可以使用sed,如果您使用支持比grep更扩展的正则表达式的-n (没有打印),它具有类似grep的模式。过滤以-old结尾的行的技巧在下面找到:Sed regex and substring negation

代码语言:javascript
复制
sed -n "/-old/b; s/^Host\s\+\(vps\S*\)\s*\(#.*\)\?/\1/p" $HOME/.ssh/config

逆(包括-old)稍微简单一些,因为它只需要正匹配:

代码语言:javascript
复制
sed -n "s/^Host\s\+\(vps\S*-old\)\s*\(#.*\)\?/\1/p" $HOME/.ssh/config
票数 5
EN

Stack Overflow用户

发布于 2022-01-10 12:37:05

这可能对您有用(GNU sed):

代码语言:javascript
复制
sed -En '/-old/!s/^Host\s*(vps\S*).*/\1/p' file

使用-n-E选项关闭隐式打印和扩展regexp。

如果一行不包含-old,则在开头为Host的行中匹配一些空格,然后是vps,然后是零或多个非空白,然后是任何非空格,然后替换为vps,然后是任何非空白,然后打印结果。

若要仅显示其中包含-old的行,请使用:

代码语言:javascript
复制
sed -En '/-old/s/^Host\s*(vps\S*).*/\1/p' file

注:这依赖于不包含注释或多个主机名的Host行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70647784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档