1

我需要搜索一个数组,然后一旦我找到我正在寻找的内容,读取该元素加上几个相同的数组并将所有内容写入文件。

这是我到目前为止所拥有的

if [ -e "${EPH_DIR}" ]
then
  i=0
  while read line
  do
    FILE[$i]="$line"
    i=$(($i+1))
  done < ${EPH_DIR}
fi

for i in ${FILE[*]}
do
  echo "$i"
  if [[ $i == ${SAT} ]]
  then
    echo "Found it: $i"
  fi
done
4

2 回答 2

0

您可以使用内置grep开关-A

   -A NUM, --after-context=NUM
          Print NUM lines of trailing context after matching lines.

只需将数组的内容通过管道输入grep并使用-A,即可为您提供您想要打印的许多额外行。例如,用于-A2在任何行匹配后打印另外两行$STAT

printf -- '%s\n' "${FILE[@]}" | grep -A2 "^$SAT$"

如果您希望将其发送到一个新文件,就像问题的标题所暗示的那样,那么只需将其重定向到您想要的位置:

printf -- '%s\n' "${FILE[@]}" | grep -A2 "^$SAT$" > /path/to/my/file

由于看起来您的数组只是从目录中获取文件列表$EPH_DIR,而不是使用循环,您可以通过执行以下操作将列表放入数组中:

FILE=( "$(ls $EPH_DIR)" )

或者,如果此打印是您使用数组的唯一目的,您可以完全跳过数组,直接将目录列表发送到grep

ls $EPH_DIR | grep -A2 "^$SAT$"
于 2013-05-01T20:52:40.920 回答
0

如果您想在 C 风格的 for 循环中执行此操作:

for ((i=0; i < ${#FILES[@]}; i++)); do
    if [[ ${FILES[i]} == $SAT ]]; then
        printf "%s\n" "found it" "${FILES[i]}" "${FILES[i+1]}" "${FILES[i+2]}"
    fi
done

请注意,括号中的数组索引是算术表达式,因此不需要美元符号。

于 2013-05-01T19:26:42.413 回答