Refere-se a uma variável de loop em um argumento

0

Eu tenho um loop de script (myscript.sh) que grep s algumas strings em muitos arquivos diferentes, armazena-os em um novo arquivo e, em seguida, cat s o conteúdo deste arquivo para o terminal:

for i in {1..201..5}; do
        grep "Pitch" filename-$i.log | cut -d" " -f25
done > pitch.txt
echo "========Pitch==========="
cat pitch.txt

Aqui está o que eu gostaria de fazer em vez da linha de comando:

./myscript.sh filename-$i.log

Isso, então, executa o myscript.sh, passando o loop sobre a variável i a que me refiro no argumento para myscript.sh.

Espero ter explicado meu objetivo aqui corretamente!

    
por Yoda 21.03.2017 / 11:48

4 respostas

4

Se você deseja passar a parte base dos diferentes nomes de arquivos como o primeiro parâmetro para o seu script, altere o loop para:

for i in {1..201..5}; do
        grep "Pitch" "${1}-${i}" | cut -d" " -f25
done > pitch.txt

(assumindo que o traço está sempre lá, e não passado como parte do parâmetro, e a parte variável dos nomes de arquivos é sempre no final)

    
por 21.03.2017 / 12:06
0

Não está exatamente claro o que você está procurando, mas pelo que entendi é que você tem 6 diretórios, mas cada diretório tem arquivos nomeados de forma semelhante, com números no final. Então você poderia fazer isso assim:

for arg
do
   for i in {1..201..5}; do
      grep "Pitch" "$arg-$i" | cut -d" " -f25
   done > $arg/pitch.txt
   echo "========Pitch==========="
   cat $arg/pitch.txt
done
    
por 21.03.2017 / 14:05
0

Use esta sintaxe:

for ((i=0; i<=$1; i=(($i + 5)) ))
        grep "Pitch" filename-$i | cut -d" " -f25
done > pitch.txt
echo "========Pitch==========="
cat pitch.txt
    
por 21.03.2017 / 12:11
0

Esta função bash deve funcionar:

foo() {
    searchstring="$1"
    shift 1
    echo "========${searchstring}===========" ; 
    grep --no-filename "${searchstring}" "$@" | \
    cut -d" " -f25 | tee "${searchstring,,}".txt 
    }

Invoque da seguinte forma:

foo Pitch filename-{1..201..5}

Como funciona. Como grep permite vários nomes de arquivos a partir da linha de comando, e bash permite prefixar uma string com código como {1..10} , não é necessário passar nomes de arquivos de uma vez por meio de um loop for . O cat e o > podem ser substituídos por um único tee .

O primeiro argumento de foo é a string de pesquisa, (por exemplo, " Match "), que o shell define como " $ 1 " - que é movido para uma variável temporária $searchstring , então " Correspondência " é removida com shift 1 , para que " $ @ " contenha apenas os nomes dos arquivos.

    
por 21.03.2017 / 15:05