我正在使用数组来处理我文件中的空格。但是当我使用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命令的输出
感谢。我添加了declare -p hiteshcharry并开始打印数组的每个元素。但我错误地显示在图片中。
答案 0 :(得分:2)
当您将数组传递给grep
到"${array[@]}"
时,grep
会将每个数组元素视为一个单独的参数。因此,第一个元素将成为要搜索的模式,第二个元素将成为要搜索的文件名。显然,这不是你想要的。
您可以使用进程替换使grep
与数组中包含的字符串匹配,如下所示:
omnidb -session "$sessionid" -detail | grep -Fxf <(printf '%s\n' "${hiteshcharry[@]}")
printf
将为每个元素打印一行数组元素grep -Fxf
将about输出视为包含要搜索的字符串的文件(-F选项将它们视为字符串,而不是模式,-x匹配omnidb输出的整行,防止任何部分匹配)