grep substring,它是一个带有前缀dot的变量

时间:2018-06-12 11:52:09

标签: linux shell grep

我有一个数值为namespace=(example examples-ixx)的数组 我需要使用for循环遍历此数组,其中我将example字符串存储在名为ns的变量中。以下是我将要查看的文件内容。

http://example-service-v2.example-ixx:8080/actuator/info
http://example-service-v2.example:8080/actuator/info

我试过以下组合,但它没有用 grep -w ".$ns" filename grep -w "\.$ns" filename fgrep -w ".$ns" filename fgrep -w "\.$ns" filename

我想grep确切的字符串,当前分配给变量$ ns。不多也不少。有人可以帮我这个。

3 个答案:

答案 0 :(得分:0)

根据您的问题,让我们设置一个数组:

declare -a namespace=(
  example
  example-ixx
)

然后,您可以单步执行数组,为每个元素运行grep。例如:

for ns in "${namespace[@]}"; do
  printf '%s> %s\n' "$ns" "$(grep "\.$ns:" input.txt)"
done

请注意,这并不能防止您的网址列表中出现多个条目。当然,我不知道这是否重要。

或者,您可以从数组内容构建一个正则表达式:

grep -E "\.($(IFS="|$IFS"; printf '%s\n' "${namespace[*]}")):" input.txt

这导致单个输出流而不是每个数组元素处理一行,并且可能因源数组中包含正则表达式特殊字符而变得复杂。

请注意,使用这两种解决方案,我们会根据您问题中的示例输入,在.:中包含我们正在搜索的内容。

答案 1 :(得分:0)

def display_avatar(user) if user.avatar.attached? user.avatar else 'default.png' end end 毁了你的一天。在man-page中,描述了-w选项:

仅选择包含构成整个单词的匹配项的行。测试是匹配的子字符串必须位于行的开头,或者前面是非单词构成字符。

如果您有一个字符串 v2.example:,则点前面的字符是 2 ,这是一个单词字符,因此不匹配。你当然可以写

-w

但这也会捕获 .exampleabc

只要您的变量grep -F ".$ns" .... 不包含正则表达式中具有特殊含义的字符,就可以使用

ns

因为grep -E "[.]$ns\\>" .... 匹配单词边界。但是,如果\>确实包含此类字符,则无效。你可以通过

改进它
ns

因为grep -E "[.]\\Q$ns\\E\\>" .... \Q之间的内容是字面上的,但这个解决方案也不完美:如果\E本身包含这些特殊的转义,那么你会得到有趣的结果。

从技术上讲,人们需要转义ns内的所有正则表达式字符,但只使用POSIX shell的工具,这是我甚至不会强行让敌人做的事情。如果你真的需要一个适用于一般情况的解决方案,那么使用Perl或Ruby等语言编写的小脚本可能更容易进行grepping,你可以在其中使用内置函数来转义正则表达式。

答案 2 :(得分:0)

我能够使用下面的grep命令解决问题。

grep -P "((?<=^)|(?<=\s))$var(?=(\s|$))"