Bash for 循环打印出意外的输出,为什么呢?

2024-03-01

我编写了一个脚本,用于查询 AWS Route53 上的 dns 区域并返回特定服务器的 IP。

目的是在启动 CloudFormation 堆栈后运行此脚本,并且该脚本将更新我的本地~/.ssh/config包含更新的服务器 IP 的文件。

我想“捕获”配置中以 HostName 开头但与我要编辑的服务器的主机名相关的行,因此我运行了以下命令:

$ 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

编辑#2: 好的,所以相关部分~/.ssh/config文件看起来像这样:

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

该文件包含许多与上面类似的块,但我只想 sed 只包含我在 grep (dev-api2.company-private) 中使用的字符串的块的“HostName”行。

@anubhava:您答案中的代码更改了包含字符串“HostName”的行,即使在与“dev-api2.company-private”无关的块中也是如此。

如何做呢?


你应该使用这个while read循环使用过程替代代替for循环使用命令替换:

while IFS= read -r line; do
    echo "$line"
done < <(grep -A2 dev-api2.company-private ~/.ssh/config)

根据您的意见,我建议最好使用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

要保存更改,请使用此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

这是一张内衬sed做同样的工作:

sed -i.bak '/dev-api2\.company-private/{N;p;N;s/.*/HostName 1.1.1.1/;}' ~/.ssh/config
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash for 循环打印出意外的输出,为什么呢? 的相关文章

  • 在 python 中使用正则表达式返回唯一匹配

    生成正则表达式的所有唯一匹配项的最有效 或最 Pythonic 方法是什么 现在我刚刚申请set 使用后findall 但我不确定是否有更好的方法 查找所有匹配项的其他方法 使用其他方式通过正则表达式在文本中搜索 您可以与一路上获得的匹配项
  • Bash 脚本在 for 循环中使用 sed 和变量?

    我正在尝试编写一个 bash 脚本 该脚本需要一些变量 然后使用 grep 对给定文件搜索进行查找 替换 以获取包含该字符串的文件列表 我认为我遇到的问题是在 sed 中看到变量我不确定它可能是什么 if searchFiles a old
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • 使用 sed 更改 /etc/fstab

    我想改 etc fstab在脚本内 我想添加acl属性到根分区 One fstab行条目如下所示 UUID 730aee20 52b7 4920 75cd d0d995ef2445 ext3 errors remount ro 0 1 我想
  • 如何将字符串转换为正则表达式文字

    逃避任意的最好方法是什么std wstring在正则表达式中使用 例如 转换you owe me to you owe me 我的场景 我想使用std tr1 wregex搜索整个单词 所以我想做一些类似的事情 std wstring Re
  • 为什么我不能用这个循环从 bash 历史记录中删除多个条目

    这个循环将显示我想要做的事情 但是如果我删除echo从中 它实际上不会删除任何内容 history grep 0 5 0 9 ls cut c1 5 while read id do echo history d id done 我添加了缩
  • C# 中的高级替换

    我喜欢用 C 替换 xml 字符串 中的一些属性 示例 XML
  • Ansible:findall 正则表达式中变量的正确语法是什么

    我使用的是 Ansible 版本 2 9 我想做一个 GET 它返回一个信息块 从该信息中正则表达式一个 ID 该 ID 对应于我目前正在迭代的任何主机 然后使用该 ID 执行操作 我有正则表达式工作 https regex101 com
  • shell脚本响应按键

    我有一个 shell 脚本 本质上是这样的 while true do read r input if input a then echo hello world fi done 这一切都很好 但我刚刚意识到在这种情况下必须按 ENTER
  • Mac 上使用 Excel VBA 进行正则表达式

    我需要将 regEx 与 Excel VBA 一起使用 我使用的是 Mac OS 10 10 和 Office 2011 因此没有可以使用的 DLL 文件 这里有什么可做的 我读到我必须绑定一个苹果脚本 这是如何完成的以及该脚本需要什么内容
  • 使用环境变量将参数传递给命令

    我正在尝试编写一个 bash 脚本 该脚本采用环境变量并将其传递给命令 所以如果我有类似的东西 export OUT a arg1 b arg2 0 arg2 1 我想在我的 bash 脚本中执行以下操作
  • Python 按照层次结构按多个分隔符分割字符串

    我只想根据多个分隔符 例如 and 和 按顺序分割字符串一次 例子 121 34 adsfd gt 121 34 adsfd dsfsd and adfd gt dsfsd adfd dsfsd adfd gt dsfsd adfd dsf
  • 为什么 sed 将替换文本放在行首?

    在 Mac OS X bash 上 我在命令行中使用以下 sed sed s S 1 file1 txt gt file2 txt file1 txt有这样的行 some path to somewhere some stuff here
  • Bash:将输出传输到后台进程?

    我想将一个进程放入后台 然后多次将数据传递给它 例如 cat The command I want to write into cat pid Getting the process id of the cat process echo h
  • 在R中提取其他两个字符串之间的字符串

    我试图找到一种简单的方法来提取出现在两个已知子字符串之间的未知子字符串 可以是任何内容 例如 我有一个字符串 a lt anything goes here STR1 GET ME STR2 anything goes here 我需要提取
  • ( 后的正则表达式匹配数

    我正在尝试使用正则表达式来匹配开括号 字符后的可变长度的数字 我努力了 d 但该正则表达式在匹配中包含括号 我该如何排除它 我正在使用 Sublime Text 正则表达式引擎来进行匹配 您可以使用积极的后视 http www regula
  • 忽略正则表达式匹配的嵌套括号内的逗号

    我有以下正则表达式 s s g这允许我匹配由逗号分隔的元素 同时忽略内部的逗号 有这个 a b c aaa bbb ccc d 我明白了 a b c aaa bbb ccc d 现在 我想升级它以考虑另一个级别的括号 我不想考虑任何级别 我
  • 删除 .htaccess 中 URL 中各处的多组斜杠

    我目前有一个网站 访客可以访问每个网址 并使用任意数量的斜杠来分隔文件夹名称 例如 如果 URL 应该是 http example com one two three four 然后用户可以通过以下任意方式访问同一页面 http examp
  • 转换MAC地址格式

    我刚刚编写了一个小脚本 从交换机中提取数百个 MAC 地址进行比较 但它们的格式为 0025 9073 3014 而不是标准的 00 25 90 73 30 14 我对如何转换它感到困惑 我能想到的最好的办法就是在 处将它们分解成碎片 然后
  • Excel VBA 自动过滤子字符串

    我的 Excel 中有多行 其中 D 列为 TDM 02 Bundle Rehoming 5 NE TDM 02 Bundle Rehoming 23 NE IP 02 Bundle Rehoming 7 NE 等 请注意 大多数情况下 N

随机推荐

  • 更改 UIAlertView 的背景颜色?

    我想更改 UIAlertView 的背景颜色 但这似乎没有颜色属性 AlertView的背景是一张图片 你可以改变这个图像 UIAlertView theAlert UIAlertView alloc initWithTitle Atent
  • “似乎不是 NgModule 类。”更新到 Angular@15 后出错

    我正在尝试从以下位置更新Angular 13 to Angular 15 这样做之后 我收到了我完全不明白的编译错误 SharedModule does not appear to be an NgModule class src app
  • 在裸机 RPI 集群上使用 Metallb 的 LoadBalancer 安装后无法工作

    我正在摆弄我设置的 RPI 集群Kubeadm我想让 LoadBalancers 能够在集群上工作 节点的 IP 是静态的 并且设置为192 168 1 100 192 168 1 103对于主节点和工作节点 我已经使用官方网站文档安装了
  • asp.net OnClientClick 未呈现最初禁用的按钮

    我有一个禁用的 asp Button 稍后我用 JavaScript 启用它 像这样
  • s[i]^=32 如何将大写转换为小写?

    int main string s cout lt lt enter the string lt lt endl cin gt gt s for int i 0 i lt s length i s i 32 cout lt lt modif
  • Clojure 常量的约定、样式和用法?

    在 Clojure 中定义常量的最佳实践有哪些 包括样式 约定 效率等 例如 这是正确的吗 def PI 3 14 问题 Clojure 中常量应该大写吗 从风格上来说 它们应该在一侧还是两侧都有星号 字符 我应该注意哪些计算效率注意事项
  • 安卓白标

    我在一家公司工作 该公司在商店里有这个 foo 应用程序 该应用程序是我们硬件的助手 深受经销商的喜爱 我们确保该名称尽可能通用 以便我们的供应商能够将应用程序作为 他们的应用程序 进行营销 然而 一些经销商确实希望在应用程序上显示他们的确
  • 使用 stanford-nlp 对一些文本进行分块

    我正在使用 stanford core NLP 并使用此行加载一些模块来处理我的文本 props put annotators tokenize ssplit pos lemma ner parse dcoref 是否有一个模块可以加载以分
  • jQuery 使用数据 id 对元素进行排序

    我的 HTML 结构如下 div class clist div div div div div div div div div div div div div div div 我想将它们排序为 div class clist div di
  • 从 Google Sheets API 获取过滤后的数据

    我正在使用 nodeJS 从 google 工作表中获取数据 URL 如下所示 var url https sheets googleapis com v4 spreadsheets sheet key values Sheet2 A1 J
  • 编译与编译树与编译文件之间的区别?

    我试图将我的项目集成到 android studio 中 但在添加依赖项时我有点困惑 我不知道哪一个效果好 我尝试过编译文件树和编译文件 它不适合我 我找到了一些方法 任何人都可以告诉我哪一种适合添加库 仅像 admob 这样的 jar 文
  • ModSecurity CSRF 规则警报

    我已经安装了 Owasp ModSecurity 之后我的应用程序上的所有页面都有此规则警报 ModSecurity Warning Match of eq 1 against ARGS CSRF TOKEN required file e
  • “添加为链接”选项发生了什么?

    为什么是添加现有文件作为链接 http visualstudiohacks com tips options add an existing file to a project without copying it 功能仅适用于托管项目 我
  • 从 url 加载图像

    如何从图像的 url 将图像加载到 UIImage 对象 目前 我正在使用 UIImage FromFile 加载图像 并将图像作为内容包含在内 但我需要能够从另一个网站获取它 image Image UIImage FromFile im
  • GitHub Action:使用 PowerShell 将环境变量传递到 Action 中

    我正在尝试构建一个将在 PowerShell 中运行的工作流程 我正在为我的分支名称设置一个环境 以便在签出不同存储库的步骤中使用 run branchName Env GITHUB REF replace refs heads echo
  • 与需要参数的工厂方法统一

    我想使用需要参数的工厂方法在 Unity 容器中注册类型 这些参数将由统一解析 但只能在运行时解析 工厂方法代码 public static IApp Create IOne ITwo 注册码 container RegisterType
  • 如何将包含 JPanel 的 JScrollPane 视口滚动到特定位置

    我正在尝试创建一个大型游戏板 其中只有一部分在视口中可见 并且希望能够使用箭头键移动视口以查看整个板 现在我有一个 JScrollPane 其中包含一个 JPanel 其中包含图像 文本和其他内容 但这些都是无关紧要的 现在我有一个与 JP
  • 如何使用 Python 3.5.1 从列表中打印多个不连续的值

    我创建了一个列表 并想从列表中选择一些要打印的项目 下面 我只想在索引 0 处打印 bear 在索引 3 处打印 kangaroo 我的语法不正确 gt gt gt animals bear python peacock kangaroo
  • 使用 C++ 线程模拟 pthread_kill

    如何使用 C 线程模拟 pthread kill 函数 我之前问过这个问题 但没有得到回应 thread native handle 函数在这里有帮助吗 所以这个问题的答案是依赖平台相关的功能并使用std thread native han
  • Bash for 循环打印出意外的输出,为什么呢?

    我编写了一个脚本 用于查询 AWS Route53 上的 dns 区域并返回特定服务器的 IP 目的是在启动 CloudFormation 堆栈后运行此脚本 并且该脚本将更新我的本地 ssh config包含更新的服务器 IP 的文件 我想