bash-读取一个数组,然后从该点写入一些元素到文件

时间:2013-05-01 18:48:01

标签: bash

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

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

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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$"