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