Regex Bash for循环打印意外输出,为什么?
我编写了一个脚本,查询AWS Route53上的dns区域并返回特定服务器的IP 目标是在启动CloudFormation堆栈后运行此脚本,该脚本将使用更新的服务器IP更新我的本地Regex Bash for循环打印意外输出,为什么?,regex,bash,awk,sed,Regex,Bash,Awk,Sed,我编写了一个脚本,查询AWS Route53上的dns区域并返回特定服务器的IP 目标是在启动CloudFormation堆栈后运行此脚本,该脚本将使用更新的服务器IP更新我的本地~/.ssh/config文件 我想“捕获”配置中以主机名开头但与我要编辑的服务器主机名相关的行,因此我运行了以下命令: $ grep -A2 dev-api2.company-private ~/.ssh/config Host dev-api2.company-private User ec2-user HostN
~/.ssh/config
文件
我想“捕获”配置中以主机名开头但与我要编辑的服务器主机名相关的行,因此我运行了以下命令:
$ grep -A2 dev-api2.company-private ~/.ssh/config
Host dev-api2.company-private
User ec2-user
HostName 5.5.5.5
接下来,我运行:
$ for line in $(grep -A2 dev-api2.company-private ~/.ssh/config); do echo $line ; done
Host
dev-api2.company-private
User
ec2-user
HostName
5.5.5.5
由于某些原因,输出并不像我预期的那样打印,它将每个单词分隔成一行,但为什么会发生这种情况
编辑#1:
我的想法是这样做:
for line in $(grep -A2 dev-api2.company-private ~/.ssh/config)
do
if [[ $line == "^HostName.*" ]]
then
sed -i 's!$line!HostName 1.1.1.1!g' ~/.ssh/config
fi
done
Host as-bastion
User ec2-user
HostName ec2-34.us-west-2.compute.amazonaws.com
IdentityFile ~/.ssh/company/bastion.pem
Host dev-api1.company-private
User ec2-user
HostName 172.51.24.171
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p
Host dev-api2.company-private
User ec2-user
HostName 172.51.25.248
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p
编辑#2:
好的,~/.ssh/config
文件的相关部分如下所示:
for line in $(grep -A2 dev-api2.company-private ~/.ssh/config)
do
if [[ $line == "^HostName.*" ]]
then
sed -i 's!$line!HostName 1.1.1.1!g' ~/.ssh/config
fi
done
Host as-bastion
User ec2-user
HostName ec2-34.us-west-2.compute.amazonaws.com
IdentityFile ~/.ssh/company/bastion.pem
Host dev-api1.company-private
User ec2-user
HostName 172.51.24.171
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p
Host dev-api2.company-private
User ec2-user
HostName 172.51.25.248
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p
该文件包含许多与上面类似的块,但我只想使用包含我在grep(dev-api2.company private)中使用的字符串的块的“HostName”行
@anubhava:答案中的代码更改了包含字符串“HostName”的行,即使在与“dev-api2.company private”无关的块中也是如此
如何做到这一点?您应该在使用进程替换读取循环时使用此
,而不是使用命令替换读取
循环:
要保存更改,请使用此awk
命令:
awk -v ORS='\n\n' -v RS= -v api='^Host dev-api2' -v ip='1.1.1.1' '
$0 ~ api "\\.company-private$" {sub(/\nHostName [^\n]+/, "\nHostName " ip)} 1
' ~/.ssh/config > $$.tmp && mv $$.tmp ~/.ssh/config
这里有一个liner
sed
来完成相同的工作:
sed -i.bak '/dev-api2\.company-private/{N;p;N;s/.*/HostName 1.1.1.1/;}' ~/.ssh/config
我收到以下错误:
sed:1:“/Users/itai/.ssh/config”:我需要的命令\后跟文本,您知道如何修复它吗?谢谢你的快速回复。是的,我已经用bash-shebang将你的代码插入到一个文件中,并在我的mac上运行了它。太棒了!你太棒了。@ItaiGanot:你可以使用:awk-v-api='dev-api2'-v-ip='1.1.1'$0~api'\.company private'{p=NR}p&&NR==p+2&/^HostName/{$0=“HostName”ip;p=0}1'~/.ssh/config
@EdMorton:谢谢你的宝贵提示。我已经用awk
命令更新了答案,使用vrs=
读取并