Usando sed com herestring () e leia -a

2

Eu uso sed com <<< e read para atribuir todas as palavras em uma string a variáveis. O que eu faço é:

read -a A0 <<< $(sed '2q;d' /proc/stat)

Portanto, sed lê a segunda linha do arquivo file e imediatamente sai. A linha sed foi lida para <<< , o que expande a entrada que recebe de sed e read -a atribui os valores resultantes de <<< aos elementos de uma matriz. O uso de <<< e sed é uma boa ideia ou há razões óbvias que falam contra isso e, acima de tudo, há uma maneira mais rápida de fazer isso?

    
por lord.garbage 02.09.2014 / 16:04

2 respostas

3

Você pode usar a atribuição de matrizes diretamente:

A0=($(sed '2q;d' /proc/stat))

Tenha em atenção que isto realiza globbing: se a saída do comando contiver caracteres curinga do shell, as palavras que contêm caracteres universais são substituídas pela lista de ficheiros correspondentes, se existirem. Se a saída do comando puder conter um dos caracteres \[?* , desative temporariamente a globbing:

set -f
A0=($(sed '2q;d' /proc/stat))
set +f

Isso pode ser minúsculo mais rápido do que usar read :

$ time for i in {1..1000}; do read -a A0 <<< $(sed '2q;d' /proc/stat); done

real    0m2.829s
user    0m0.220s
sys     0m0.480s

$ time for i in {1..1000}; do A0=($(sed '2q;d' /proc/stat)); done

real    0m2.388s
user    0m0.128s
sys     0m0.276s

Com bash 4.0 e acima, você pode usar mapfile :

mapfile -t < <(sed '2q;d' /proc/stat)

Mas mapfile parece ser mais lento:

$ time for i in {1..1000}; do mapfile -t < <(sed '2q;d' /proc/stat); done

real    0m3.990s
user    0m0.104s
sys     0m0.444s
    
por 02.09.2014 / 16:26
0

A sintaxe parece muito complexa para os meus olhos. Eu usaria o seguinte em vez disso:

read -a A0 < <( sed '2q;d' /proc/stat )

Eu costumo usar a sintaxe <<< word quando eu preciso de um comando para receber a entrada de uma variável, não de outro comando.

    
por 02.09.2014 / 16:17