【问题标题】:grep and AWK command to read host name and print columnsgrep 和 AWK 命令读取主机名和打印列
【发布时间】:2017-02-06 12:45:20
【问题描述】:

我正在使用以下简单的 grep 和 AWK 命令来匹配 CSV 文件中的主机名和打印 ID。

我的命令:

#!/bin/bash
host=`hostname`
/bin/cat /tmp/MasterInventory.csv | grep -i $host | awk -F, '{print $1}' > /opt/input_appProfile.id

我的 CSV 清单:

Hostname                  App_ID       
SercverTest345             12               
Mytestserver01             17               
Mytestserver02             19  

如果 cmd 搜索 Mytestserver02 它正在打印 App_ID 17 & 19,但实际上它应该只打印 19 按照主机名

请帮我解决这个问题。

【问题讨论】:

  • 如果你的csv文件没有逗号,你为什么要写awk -F,
  • awk -v host="Mytestserver01" '$1==host{print $2}' /tmp/MasterInventory.csv 这样的东西顺便说一句应该适用于你的情况,但我认为你的问题有很多重复。
  • 您的解决方案只会匹配 exact 主机名。他对 grep 的使用似乎表明他也想要部分匹配。因此:awk -v host="Mytestserver01" '$1~host{print $2}' /tmp/MasterInventory.csv
  • 您说“我的 CSV”并显示一个不带逗号的文件。您发布的内容是否真的是您的输入文件格式(即它不是 CSV),或者您是否试图向我们展示您认为更易于阅读的 CSV 文件的表示形式? edit 你的问题是要么向我们展示 CSV 文件,要么摆脱说它是 CSV 文件的测试(并说明它的真实含义,例如多空格或制表符分隔或固定宽度字段)

标签: linux bash shell awk grep


【解决方案1】:

在 cmets 之后编辑:

这是一个纯粹的awk 解决方案:

awk -v host="$(hostname)" 'tolower($1)~tolower(host){print $2}' /tmp/MasterInventory.csv > /opt/input_appProfile.id

这是一个使用grep的解决方案,如果你喜欢这样的话:

grep -i `hostname` /tmp/MasterInventory.csv | awk '{print $1}' > /opt/input_appProfile.id

awk 优于grep 的解决方案的优势是您只匹配第一列而不是整行。另外,如果您使用 == 而不是 ~,则可以确保您只获得准确的主机名匹配。

【讨论】:

  • 您不需要导出变量,因为您在同一个 bash 脚本中使用 grep
  • 在使用 awk 时,您永远不需要 grep,因为 awk 可以做 grep 可以做的任何有用的事情。
  • @EdMorton 由于我们正在进行不区分大小写的搜索,而 IGNORECASE 是个傻瓜,我能想出的唯一解决方案是 awk -v host="Mytestserver01" 'tolower($1)~tolower(host){print $2}' /tmp/MasterInventory.csv... 在我看来,更少比 grep -i 漂亮且易读。
  • 是的,这将是进行不区分大小写测试的非 gawk 方式,但更重要的是请注意,没有 grep 的 awk 脚本突然变得更加健壮,因为您现在只在第一个检查主机名字段,而不是像使用 grep 那样跨越整行,并且如果您将其设为 == 而不是 ~ 那么它仍然会变得更加健壮,因为您现在将进行字符串比较而不是正则表达式并且您不会不再有部分匹配的错误成功。您将从一个充满希望的 grep 解决方案转变为一个坚如磐石的 awk 解决方案。顺便说一句,我没有对你投反对票!
  • 谢谢,好点。虽然我们不知道部分匹配(~而不是==)是否是原始解决方案的意图。关于否决票:显然我应得的:-P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多