我正在尝试grep匹配某些模式的行,然后尝试打印那些匹配的行。
#!/bin/bash
file=/path/to/some/file
pattern=socket
if [ -f $file ]; then
lines=`grep -i "$pattern" $file`
# Case 1
for x in $lines; do # <--- isn't this an array
echo "$x"
done
# Case 2
while read -r line_a; do
echo "$line_a"
done <<< "$lines"
fi
输出:
情况1:不是完整的行,而是将这些行中的各个单词打印在每一行上。
情况2:逐行打印。
问题:
为什么情况1不在一行上打印整行,而不是在每一行上打印该行中的单个单词?是不是$lines
一个字符串数组(在我的情况下是行)?
当前,您正在使用向后滴答来捕获输出,该滴答会将整个输出视为一个大字符串。如果要将其捕获为数组,请使用以下符号
lines=($(grep -i "$pattern" $file))
但是,默认记录分隔符为空格,因此每个数组元素将是一个单词,而不是grep
输出中的整行。您可以通过(临时)更改记录分隔符IFS
来分割换行符来避免这种情况。整个解决方案如下所示
IFS=$'\n'
lines=($(grep -i "$pattern" $file))
for x in ${lines[@]}; do
echo $x
done
请注意,您现在已经更改IFS
了外壳程序,并且可能需要将其重置为旧值。如您所见,这种方法很可能不是最适合您的问题的方法,但我在此处将其发布以回答您的原始问题
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句