数组内容中的空格被grep破坏

时间:2017-03-20 15:49:41

标签: arrays bash grep space

我正在使用数组来处理我文件中的空格。但是当我使用grep过滤数组的值时,它会因为空格而破坏。

例如我的行如下

bbbh.cone.abc.com:/home 'bbbh.cone.abc.com 

因为它有空格我按照下面的方式使用数组。

object1=$(echo "$line" | awk '{print $1}' )
object2=$(echo "$line" | awk '{print $2}' )
object3=$(echo "$line" | awk '{print $3}' )
object4=$(echo "$line" | awk '{print $4}' )
hiteshcharry=("$object1" "$object2" "$object3" "$object4")
grep  "${hiteshcharry[@]}" <filename>

因为空格而给我错误。

以下是示例。

我的文件中有以下行。

st.cone.abc.com:/platform/sun4v/lib/sparcv9/libc_psr.so.1 space&#39; st.cone.abc.com space [/ platform / sun4v / lib / sparcv9 / libc_psr。 so.1]&#39;

所以我上面的行有2个空格。我以这种方式编写了我的脚本,以便它可以处理最多4个空格的行。

当我在命令

下运行时

omnidb -session&#34; $ sessionid&#34; -detail | grep&#34; $ {hiteshcharry [@]}&#34;

因为空格而给我错误。但是,当我打印数组的值时,它显示我正确的值。

示例: -

我文件中的一行如下(它有2个空格)

st.cone.abc.com:/platform/sun4v/lib/sparcv9/libc_psr.so.1 space&#39; st.cone.abc.com space [/ platform / sun4v / lib / sparcv9 / libc_psr。 so.1]&#39;

我将此值放在名为hiteshcharry的数组中。当我在命令

下运行时

omnidb -session&#34; $ sessionid&#34; -detail | grep&#34; $ {hiteshcharry [@]}&#34;

由于数组值的空格,它给了我错误。在输出中,它应该过滤具有等于名为hiteshcharry的数组的值的行。

我希望现在很清楚。

omnidb命令的输出在图片中。所以我想grep行

&#34; st.cone.abc.com:/platform/sun4v/lib/sparcv9/libc_psr.so.1 space &#39; st.cone.abc.com空间[/platform/sun4v/lib/sparcv9/libc_psr.so.1]'"来自

图片中的omnidb命令的输出

enter image description here

感谢。我添加了declare -p hiteshcharry并开始打印数组的每个元素。但我错误地显示在图片中。

enter image description here

1 个答案:

答案 0 :(得分:2)

当您将数组传递给grep"${array[@]}"时,grep会将每个数组元素视为一个单独的参数。因此,第一个元素将成为要搜索的模式,第二个元素将成为要搜索的文件名。显然,这不是你想要的。

您可以使用进程替换使grep与数组中包含的字符串匹配,如下所示:

omnidb -session "$sessionid" -detail | grep -Fxf <(printf '%s\n' "${hiteshcharry[@]}")
  • printf将为每个元素打印一行数组元素
  • grep -Fxf将about输出视为包含要搜索的字符串的文件(-F选项将它们视为字符串,而不是模式,-x匹配omnidb输出的整行,防止任何部分匹配)