Bash: сохранить вывод команды в массив с \n в качестве разделителя

У меня есть вывод, как это:

dn: CN=XXX XXX,OU=XXX,OU=XXX,O=XXX
cn: XXX XXX
telephonenumber: 1234

dn: CN=XXX XXX,OU=XXX,OU=XXX,O=XXX
cn: XXX XXX
telephonenumber: 1090

dn: CN=XXX XXX,OU=XXX,OU=XXX,O=XXX
cn: XXX XXX
telephonenumber: 1012

Я получаю этот вывод из простого ldapsearch команда. Я хочу сохранить этот вывод в массиве, чтобы я мог echo индекс и получить одну запись ldap, как

echo ${ldaparray[1]}

dn: CN=XXX XXX,OU=XXX,OU=XXX,O=XXX
cn: XXX XXX
telephonenumber: 1090

Таким образом, я думаю, что для массива-разделителя будет пустая новая строка.

3 ответа

Решение

Вот один из способов создания массива с помощью awk:

ldaparray=()
while IFS='' read -d '' -r record; do
    ldaparray+=( "$record" )
done < <(awk -v RS= -v ORS='\0' '1' file)

настройка RS пустая строка заставляет awk рассматривать каждый блок текста как отдельную запись. 1 всегда верно, поэтому каждая запись печатается, разделенные ORSнулевой байт.

Цикл читает каждую из этих записей и добавляет значение в массив.

+ Изменить <(awk ... file) в <(command | awk ...), если вы хотите работать с выводом команды, а не с содержимым файла.

Вы можете создать свой массив, перебирая строки, например:

# Current index of the array
i=0

# For every line of input (so ignoring '\n's)
while read line; do
    # If the line is empty, then we write in the next array spot
    if test "$line" = ""; then
        i=$(($i+1))
        continue
    fi
    # If this spot already contains some lines,
    # then we concatenate a '\n' then our current line to the array spot
    if test "${ldaparray[$i]}" != ""; then
        ldaparray[$i]="${ldaparray[$i]}\n$line"
    # else no need for a '\n'
    else
        ldaparray[$i]="$line"
    fi
done < <(ldapsearch ...)

Вам не нужно хранить его в массиве, но вы можете использовать приведенный ниже скрипт для получения i-й записи.

Использование:

./print_index.sh filename index

Пример, чтобы напечатать вторую запись из файла sample.txt, используйте


./print_index.sh sample.txt 2

FILE=$1 INDEX=$2 LINE_NUMBER=`cat $FILE| grep -n "telephonenumber"| awk -F':' {'print $1'}| head -$INDEX| tail -1` head -$LINE_NUMBER $FILE| tail -3

Другие вопросы по тегам