我有以下檔案,它是 ssh 的組態檔。
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*,下面的(復制的)片段將完全做到這一點。
$ 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作品。
$ 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
有沒有更清潔的方法?最好只涉及 1 個工具,我嘗試使用awk 命令無濟于事。
uj5u.com熱心網友回復:
您可以使用sed,如果您使用-n(無列印)支持比grep. 在-old這里可以找到過濾掉以結尾的行的技巧:Sed regex and substring negation:
sed -n "/-old/b; s/^Host\s\ \(vps\S*\)\s*\(#.*\)\?/\1/p" $HOME/.ssh/config
逆(包括-old)稍微簡單一些,因為它只需要正匹配:
sed -n "s/^Host\s\ \(vps\S*-old\)\s*\(#.*\)\?/\1/p" $HOME/.ssh/config
uj5u.com熱心網友回復:
您可以$i!~/-old$/在awk命令中添加條件:
awk '{for(i=1;i<=NF;i ){if($i~/^vps/ && $i!~/-old$/){print $i}}}' ~/.ssh/config
(注:我更喜歡~在$HOME時,它不是在雙引號,只是在路徑怪異字符的情況。)
uj5u.com熱心網友回復:
grep -Po '(?<=Host )vps\d (?!-old)' file | sort -uV
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407336.html
標籤:
上一篇:macOS上的Git推拉克隆命令在升級到Monterey后不執行任何操作
下一篇:將大文本檔案逐段拆分為多個小檔案
