【问题标题】:how to select a value from a second column using a shell script? [duplicate]如何使用 shell 脚本从第二列中选择一个值? [复制]
【发布时间】:2017-04-01 10:27:44
【问题描述】:

如果我有一个文本文件:

MachineName    IPAddress
Computer1234   10.0.1.1
Computer1235   10.0.1.2
Computer1236   10.0.1.3

一旦我从计算机上获取到 MachineName,我如何从上面的文本中获取对应的 IPAddress?

(bash?)脚本将在 Mac 上运行,上面的文本可以重新格式化和/或插入到脚本本身(大约 110 台计算机)...

【问题讨论】:

  • 可能 awk 会更好。
  • 我现在无法测试,但请尝试awk -v machine=Computer1235 '$1==machine {print $2}' file.txt
  • @sircapsalot 不是那个重复的,因为第一列使用变量匹配(否则它没用)
  • @sircapsalot 我不同意:阅读问题:“一旦我得到计算机名称,我就想要地址”。
  • 你可能是对的@Jean-FrançoisFabre。我会继续留下 cmets 以防万一,并留下我的近距离投票。谢谢!

标签: bash shell awk scripting


【解决方案1】:

这就是 awk 的用途:按模式搜索字段,然后执行一些操作。基本思路是

awk '/pattern/ {action}' file

在你的情况下

awk '/Computer1234/ { print $2 }' file

事实上,你可以更具体,使用一般的 awk 用例

awk 'condition { action }' file

awk '$1 == "Computer1234" { print $2 }' file

另一方面,将主机名转换为 IP 地址是 名称服务器 所做的。如果这不仅仅是玩弄并且需要扩展,您应该将该数据插入到名称服务器的区域文件中,然后使用名称服务访问工具(如 dig)来查询与主机名关联的地址。

【讨论】:

  • @EdMorton 感谢指点,我不断学习并删除了shell sn-p。
【解决方案2】:

使用 grep 让它变得非常简单。

grep 'Computer1234' text_file.txt | awk '{print $2}'

但是我们可以做得更好,只使用 awk。

awk -v hostname='Computer1234' '$1 ~ hostname {print $2}' text_file.txt

-v var_name= 是传递 awk 变量的方式。

$1 ~ hostname 查看第一个字段是否包含与主机名变量匹配的模式,如果是,我们打印 ip!

【讨论】:

  • 你甚至不应该显示 grep|awk 反模式。
  • 如果您熟悉 grep 而不熟悉 awk,那么在我看来,展示这两个命令之间的关系并没有什么坏处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多