Como ler linhas de uma variável | bater

1

Eu tenho um script simples que lê linhas de um arquivo de texto da seguinte forma:

#!/bin/bash
FILE=$1
while read line; do
...
done < $FILE

que funciona bem, mas agora eu quero primeiro analisar o arquivo usando o grep da seguinte forma:

INPUT_file=$(grep -E 'INPUT.*ACCEPT' $FILE)

e, em seguida, atribuir esse resultado para a variável INPUT_file

Gostaria de ler agora as linhas da variável "INPUT_file", mas quando tento incluir no loop while:

while read line; do
....
done < $INPUT_file

Eu recebo o seguinte erro:

$INPUT_file: ambiguous redirect
    
por tim 06.12.2016 / 04:59

3 respostas

2

Seria melhor você usar substituição de processo em vez de uma variável:

while read line; do
....
done < <(grep -E 'INPUT.*ACCEPT' $FILE)

(note dois caracteres < ). Isso evita o carregamento de toda a saída grep na memória de uma só vez para armazenar em uma variável. O processo grep será executado em paralelo com o loop, e o loop verá a saída de grep como entrada de read à medida que cada linha é impressa (até o buffer).

Isso tenderá a ser mais rápido e usar menos memória do que usar a substituição do comando $(...) e manter toda a saída ao redor. Também é geralmente melhor estilo se você estiver escrevendo um script específico do Bash, porque é explícito sobre o que você está usando o comando.

Indiscutivelmente, isso é um pouco um antipadrão para começar - talvez seja melhor ainda usar um pipeline comum para qualquer processamento que você precisar, em vez de while read ... e processá-lo no Bash, mas há casos válidos para usar .

    
por 06.12.2016 / 06:38
0

Isso é quando aqui string entra em cena:

while read line; do
...
done<<<$INPUT_file 
    
por 06.12.2016 / 05:26
0

Você não deve invocar grep neste caso. Tudo pode ser feito usando apenas o seu shell. Por exemplo,

while read -r line; do [[ $line =~ INPUT.*ACCEPT ]] && printf '%s\n' "$line"; done < your_iptables_file
    
por 06.12.2016 / 16:01