【问题标题】:grep multiple pattern from read input从读取输入 grep 多个模式
【发布时间】:2019-07-02 11:45:28
【问题描述】:

所以我制作了一个 bash 脚本,在重定向文件上对主机名进行 greps。但是,有些主机以“-”或“_”命名

GTR_SRV123_EST GTR-SRV123-EST

现在,我所做的是,grep 只是 FQDN 的一部分,例如 SRV123

即使我只是输入 FQDN GTR_SRV123_EST 并且它仍然会匹配这个 GTR-SRV123-EST,我有没有办法 grep 主机。

我有一个询问主机名的提示:

echo -n "Please enter the host: "
read $host


grep -i $host ${temp}/*

更新: 所以它在胡安的指挥下工作。但是,目录路径显示在输出中。我怎样才能摆脱它。

/export/home/aa12s/GLB-TXU/temp/

当前输出:

/export/home/aa12s/GLB-TXU/temp/GBL-ASA-A:100022FBC0D00038 gbl-asa-a-mode1 5005076801103673 active gbl-ac-wbg02

期望的输出:

GBL-ASA-A:100022FBC0D00038 gbl-asa-a-mode1 5005076801103673 active gbl-ac-wbg02

命令:

grep -iE "$(echo $host| awk -F '/export/home/aa12s/GLB-TXU/temp/' '{$2=$1;a=gsub(/_/, "-",$2); print $1"|"$2}' 2>/dev/null)" ${temp}/*

【问题讨论】:

  • grep -iE "$(echo $host| awk '{$2=$1;a=gsub(/_/, "-",$2); print $1"|"$2}' 2>/dev/null)" config/temp/*|awk -F \/ '{print $NF}'

标签: bash shell unix scripting


【解决方案1】:

编辑你的模式。

echo -n "Please enter the host: "
read host # Edit: not $host
host="${host//[_-]/\[_-\]}" # turn either into a *check* for either

grep -i "$host" ${temp}/*

【讨论】:

  • 这是他们给你GTR[-_]SRV123[-_]EST的模式,哈哈
  • 不幸的是,主机名彼此不同......可能是glb_servername_bas1, servername_bas1, glb_servername.. 所以过滤模式非常困难:(
  • 我所做的只是对-_ 进行全局替换,以便它们始终搜索either。这不能解决所问的问题吗?如果用户输入GLB-SERVERNAME,那么grep -i "glb[-_]servername" ${temp}/* 仍然可以找到它,不是吗?
  • 不,没有输出。
  • 请使用${temp}/* 中的示例文件和您希望允许以host 输入的具体示例以及所需的结果输出来编辑OP。
【解决方案2】:

有点老套但是试试这个:

grep -Ei "$(echo $host| awk '{$2=$1;gsub(/_/, "-",$2);print $1"|"$2}' 2>/dev/null)" ${temp}/*

摆脱文件路径:

grep -iE "$(echo $host| awk '{$2=$1;gsub(/_/, "-",$2);print $1"|"$2}' 2>/dev/null)" ${temp}/* 2>/dev/null|awk -F \/ '{print $NF}'

注意:文件内容中不得出现斜线。

【讨论】:

  • 所以我尝试使用-ei,但它会打印文件中的所有信息。相反,我使用了-iE,它可以工作。但是,此目录路径 (/export/home/aa12s/GLB-TXU/temp/) 包含在输出中。尝试通过添加 -F /export/home/aa12s/GLB-TXU/temp/ 来删除它,但它没有用.. 有什么办法可以删除它吗?
  • 宾果游戏!谢谢,兄弟@Juan Diego Godoy。你很有帮助。
【解决方案3】:

如果没有主机名同时带有 _ 和 - 下面将起作用。

输入的主机只包含_

grep -iE $(echo $host | tr "_" "-")\|$host ${temp}/*

输入的主机只包含 -

grep -iE $(echo $host | tr "-" "_")\|$host ${temp}/*

输入的主机同时包含_和-

grep -iE $(echo $host | tr "_" "-")\|$(echo $host | tr "-" "_")\|$host ${temp}/*

【讨论】:

  • 尝试了 3 项,但均无效。 :( 我猜它输入的主机包含 _ 或 -
  • 能否再次分享一下主机输入和预期结果?
  • 这段代码基本上可以帮助我。 grep -ei "$(echo $host| awk '{$2=$1;a=gsub(/_/, "-",$2);print $1"|"$2}' 2>/dev/null)" ${temp}/* 。但是,此路径 /export/home/aa12s/GLB-TXU/temp/' 也会从输出中显示。你知道我怎样才能摆脱它吗?我尝试添加-F '/export/home/aa12s/GLB-TXU/temp/',但它仍然存在。
  • 你能帮我删除这条路径/export/home/aa12s/GLB-TXU/temp/好吗:(
【解决方案4】:

你可以使用反向引用:

([_-]) : capture either _ ou - in group 1
\1 : reference group 1

试试这个命令:

grep -iE "([_-])$host\1" ${temp}/*

https://regex101.com/r/uH5SHC/1/

Wiyh host=SRV123,你将捕获:

  • GTR_SRV123_EST
  • GTR-SRV123-EST

而不是

  • GTR_SRV123-EST

【讨论】:

  • 试过这是得到错误grep: Invalid back reference
猜你喜欢
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2016-09-08
相关资源
最近更新 更多