Problemas ao criar o array com o separador de nova linha

1

Estou criando uma função para encontrar diretórios grandes no sistema de arquivos e o /n está sendo cortado de /native/proc... em cada um dos elementos da matriz que contém esse caminho. Acredito que isso tenha algo a ver comigo usando "\ n" como meu IFS, mas não tenho certeza de como fazer isso, porque sem isso ele quebra cada coluna em seu próprio elemento, o que não é o que eu quero. O que eu preciso é que cada linha completa esteja em seu próprio elemento de matriz, como o comando imprime por conta própria:

[root@JBLGSMM001 ~]# du -k / 2> /dev/null | sort -n | tail -n 10
255452  /usr/share
332644  /native/proc/82974
342119  /native/proc/70315
344519  /native/proc/70310
388510  /native/usr
683983  /usr
1226993 /native/proc/45026
9597039 /native/proc
10035430        /native
10846908        /

Função até agora

where.isdisk () {

    bigstuff=$(du -k / 2> /dev/null | sort -n | tail -n 10)
    OLDIFS=$IFS
    IFS="\n"
    bigstuff=($bigstuff)
    IFS=$OLDIFS

}

A variável bigstuff é configurada como eu quero com o seguinte:

255452 /usr/share 332644 /native/proc/82974 342119 /native/proc/70315 344519 /native/proc/70310 388510 /native/usr 683983 /usr 1226989 /native/proc/45026 9772351 /native/proc 10210742 /native 11022217 /

Então, quando eu crio o array, ele apaga a saída "/ n" s:

[root@JBLGSMM001 ~]# OLDIFS=$IFS
[root@JBLGSMM001 ~]# IFS="\n"
[root@JBLGSMM001 ~]# bigstuff=($bigstuff)
[root@JBLGSMM001 ~]# IFS=$OLDIFS
[root@JBLGSMM001 ~]# echo ${bigstuff[@]}
255452 /usr/share 332644 / ative/proc/82974 342119 / ative/proc/70315 344519 / ative/proc/70310 388510 / ative/usr 683983 /usr 1226989 / ative/proc/45026 9772351 / ative/proc 10210742 / ative 11022217 /

EDITAR

Ele também está carregando o "/" para o elemento anterior:

[root@JBLGSMM001 ~]# echo ${bigstuff[0]}
255452 /usr/share 332644 /
[root@JBLGSMM001 ~]# echo ${bigstuff[1]}
ative/proc/82974 342119 /
[root@JBLGSMM001 ~]# echo ${bigstuff[2]}
ative/proc/70315 344519 /
[root@JBLGSMM001 ~]# echo ${bigstuff[3]}
ative/proc/70310 388510 /

EDIT 2

Eu tentei substituir \n por 2 , mas ainda produz resultados indesejados:

[root@JBLGSMM001 ~]# bigstuff=$(du -k / 2> /dev/null | sort -n | tail -n 10)
[root@JBLGSMM001 ~]# OLDIFS=$IFS
[root@JBLGSMM001 ~]# IFS="2"
[root@JBLGSMM001 ~]# bigstuff=($bigstuff)
[root@JBLGSMM001 ~]# IFS=$OLDIFS
[root@JBLGSMM001 ~]# echo ${bigstuff[@]}
5545 /usr/share 33 644 /native/proc/8 974 34 9 /native/proc/7 3 5 3445 9 /native/proc/7 3 3885 /native/usr 683983 /usr 6989 /native/proc/45 6 977 387 /native/proc 778 /native 55 /
[root@JBLGSMM001 ~]# echo ${bigstuff[0]}

[root@JBLGSMM001 ~]# echo ${bigstuff[1]}
5545
[root@JBLGSMM001 ~]# echo ${bigstuff[2]}
/usr/share 33
[root@JBLGSMM001 ~]# echo ${bigstuff[3]}
644 /native/proc/8

Alguém sabe como consertar isso? Obrigado!

    
por Jesse_b 06.08.2017 / 15:40

1 resposta

1

O shell não interpretará \n em IFS como nova linha, mas como o caractere n (escaped, que não faz nada aqui). Observe que o / na frente do n não é removido.

Para definir IFS como um caractere de nova linha, use

IFS='
'

Em shells que entendem "C strings" ( bash sendo um deles), você também pode usar

IFS=$'\n'
    
por 03.02.2018 / 11:05