Учет переменной вывода в файл CSV в Bash - PullRequest
0 голосов
/ 29 ноября 2018

Я получаю некоторую информацию об экземплярах AWS в нашей среде и выгружаю их в файл CSV.

Проблема в том, что в некоторых строках есть тег с именем "owner", а в некоторых нет.

Для строк с тегом владельца выходные данные выглядят корректно и совпадают с заголовками столбцов:

    Host Name       Instance ID Private IP  Launch Time                 Instance State   Owner    AWS Account Name Account Number
    USAMZAPD1026    i-593c4fb4  10.1.232.26 2014-10-08T14:44:50.000Z    stopped          llindsay company-lab         123456789101

Но если тег владельца не существует, имя учетной записи и номер учетной записи оказываются невернымистолбцы:

    Host Name      Instance ID  Private IP     Launch Time              Instance State    Owner     AWS Account Name Account Number
    USMDCP1028-AWS i-86533615   10.1.233.18   2016-11-03T15:01:52.000Z  stopped           company-lab  123456789101

Это код, который я использую для сбора информации и вывода ее в файл:

echo "Host Name,Instance ID,Private IP,Launch Time, Instance State, Owner, AWS Account Name, Account Number" >> "$ofile"
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" >> "$ofile"
    done # Instance Loop
  done # Account Loop

Вот пример выходных данных этой команды aws, которая включаетпеременный выход.В некоторых строках указаны владельцы, а в некоторых нет.

USAMZDBD1165,i-eb836cc6,10.1.232.165,2016-02-17T17:39:24.000Z,stopped,llindsay
USAMZAPD2058,i-3f5721d2,10.1.233.58,2017-04-03T18:10:37.000Z,running,nalkema
USAMZAPD2056,i-3e5721d3,10.1.233.56,2016-06-21T18:50:19.000Z,running,nalkema
USAMZAPD2057,i-315721dc,10.1.233.57,2015-05-28T20:02:55.000Z,running,nalkema
USAMZAPD1027,i-685cfd87,10.1.232.27,2015-02-11T20:22:08.000Z,stopped,llindsay
core-usawsnproddfw,i-2cedae9f,10.48.136.36,2017-03-17T15:37:52.000Z,running
UAWSCDAP0001,i-5e31c15f,10.48.131.176,2018-10-23T17:23:21.000Z,running,Eric Somebody
USMDPB1027-AWS,i-0be1611d,10.48.128.37,2016-11-11T16:08:14.000Z,stopped
usamzdbd2153,i-7e0d8b91,10.1.233.153,2015-02-19T16:57:57.000Z,running,tsenti

Как я могу учесть изменчивость переменной $ instance_info и правильно ли выстроены столбцы?Даже если тег владельца отсутствует?

1 Ответ

0 голосов
/ 30 ноября 2018

Без каких-либо входов или выходов для работы.И только с приведенным выше примером вы можете распечатать в файл, а затем просто подсчитать количество столбцов, чтобы определить, каким может быть заголовок:

Попытка подсчета столбцов:

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

...