Без каких-либо входов или выходов для работы.И только с приведенным выше примером вы можете распечатать в файл, а затем просто подсчитать количество столбцов, чтобы определить, каким может быть заголовок:
Попытка подсчета столбцов:
readarray -t aws_instance_list < <(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [(.Tags[]|select(.Key=="Name")|.Value), .InstanceId, .PrivateIpAddress, .LaunchTime, .State.Name, (.Tags[]|select(.Key=="Owner")|.Value)] | @csv' | sed 's/"//g')
for ((instance_index=0;instance_index<${#aws_instance_list[@]};++instance_index)); do
instance_info="${aws_instance_list[$instance_index]}"
echo "$instance_info"
echo "$instance_info,$aws_account,$aws_account_number" > values.txt
numlines=$(awk '-F "," {print NF}' values.txt)
if [[ "$numlines" -eq 8 ]]; then
echo "Host Name,Instance ID,Private IP,Launch Time, Instance State, Owner, AWS Account Name, Account Number" >> "$ofile"
else
echo "Host Name,Instance ID,Private IP,Launch Time, Instance State, AWS Account Name, Account Number" >> "$ofile"
fi
done # Instance Loop
done
Теперь, когдау нас есть больше информации, я бы пошел на другой подход: Можете ли вы пойти на следующий запрос?
readarray -t aws_instance_list < <(aws ec2 describe-instances | jq -r ' (.Tags[]|select(.Key=="Owner")|.Value)] | @csv' | sed 's/"//g' | sort -u)
Таким образом, вы бы просто захватить владельца и отсортировать по уникальному значению.Попробуйте поместить его в файл, где вы можете сделать это, чтобы поместить в массив (или поместить его непосредственно в массив):
IFS=$'\r\n' GLOBIGNORE='*' command eval 'owners=($(<filename))'
На этом этапе выполните код, который вы генерировали файл со значениямибез заголовков.
readarray -t aws_instance_list < <(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [(.Tags[]|select(.Key=="Name")|.Value), .InstanceId, .PrivateIpAddress, .LaunchTime, .State.Name, (.Tags[]|select(.Key=="Owner")|.Value)] | @csv' | sed 's/"//g')
for ((instance_index=0;instance_index<${#aws_instance_list[@]};++instance_index)); do
instance_info="${aws_instance_list[$instance_index]}"
echo "$instance_info"
echo "$instance_info,$aws_account,$aws_account_number" >> values.txt
done # Instance Loop
done # Account Loop
Определите два заголовка, один с владельцем и один без:
echo "Host Name,Instance ID,Private IP,Launch Time, Instance State, Owner, AWS Account Name, Account Number" >> "$ownerfile"
echo "Host Name,Instance ID,Private IP,Launch Time, Instance State, AWS Account Name, Account Number" >> "$nofile"
Как только это будет сделано, вы можете пойти на два подхода:
Зацикливаться вокруг массивавладельцев:
for (( a = 0; a < ${#owners[@]}; a++ )); do
grep -w ${owners[a]} values.txt >> "$ownerfile"
grep -v ${owners[a]} values.txt >> "$nofile"
done
Получите значения владельцев столбцов и проверьте в собственном цикле, присутствует ли значение в массиве владельцев следующим образом:
if [[ " ${owners[@]} " =~ " ${value} " ]]; then
echo "$instance_info,$aws_account,$aws_account_number" >> "$ownerfile"
fi
if [[ ! " ${owners[@]} " =~ " ${value} " ]]; then
echo "$instance_info,$aws_account,$aws_account_number" >> "$nofile"
fi
Кто-то еще разбирается в awkможет помочь вам уменьшить, непосредственно проверив значение столбца и напечатав то, что необходимо, но это выше меня.
Вот пример того, как выполняется проверка значения столбца (если вы знаете, как это сделать дальше или кто-то другой):
awk '$7 = "owner" {print $0}'
BR