Bash:将命令的输出存储到数组,\ n为分隔符

时间:2016-12-05 11:50:02

标签: arrays bash delimiter

我有这样的输出:

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

所以我猜数组分隔符将是一个空的新行。

2 个答案:

答案 0 :(得分:1)

在awk的帮助下,这是构建阵列的一种方法:

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

RS设置为空字符串会使awk将每个文本块视为单独的记录。 1始终为true,因此每条记录都会打印,由ORS分隔,为空字节。

循环读取每个记录并向数组添加值。

如果您想使用命令的输出而不是文件的内容,请将<(awk ... file)更改为<(command | awk ...)

答案 1 :(得分:0)

您不必将其存储在数组中,但可以使用以下脚本来获取第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