como escrever 'awk here document'

0

Eu tenho um script bash:

#!/bin/bash

gawk -f realmap.awk realmap.log | column -ts: > realmap.csv

gnuplot <<-_EOF_
    set term png
    set out 'realmap.png'
    set xlabel 'index'
    set ylabel 'bytes'
    set style data lp
    plot 'realmap.csv' u 1:2 t col, '' u 1:3 t col, '' u 1:4 t col, '' u 1:5 t col, '' u 1:6 t col, '' u 1:7 t col
_EOF_

rm realmap.csv

display realmap.png

E um script do awk:

#!/usr/bin/gawk -f

BEGIN{
    printf("%s:%s:%s:%s:%s:%s:%s\n", "index", "total", "used", "free", "cached", "buffers", "cache")
}

/^#/{
    gsub("#", "")
    printf("%d:", $0+1)
}

/^M/{
    printf("%d:%d:%d:%d:", $2,$3,$4,$7)
}

/^-/{
    printf("%d:%d\n", $3, $4)
}

Como combinar esses dois scripts como um só?

    
por kev 07.12.2011 / 05:51

2 respostas

1

Você não precisa de um "documento aqui". Simplesmente coloque todo o programa awk - corretamente citado de forma que todas as aspas e metacaracteres dentro dele não sejam reconhecidas pelo shell e para que os feeds de linha e outros espaços em branco não façam com que ele seja dividido em múltiplos argumentos pelo shell - como o primeiro argumento de linha de comando, sem usar a opção awk -f . Sem -f , o primeiro argumento da linha de comandos é o programa a ser executado. A página de manual awk é sua amiga.

    
por 08.12.2011 / 01:33
5

Nota:

O padrão de script de consumo próprio no segundo exemplo de código pode ser usado para QUALQUER COISA que ler um arquivo. Não se distraia com o uso do OP de awk .

Resposta:

O que você pediu foi um heredoc. É complicado usar neste caso, mas eu amo heredocs, então vou mostrar a você como fazer isso. Você precisa incorporar um recurso bash ainda menos conhecido, substituir o processo por < ()

#!/bin/bash

  # The <( begins a process substitution. It's valid to use with -f because what gets
  # substituted is a file descriptor like /dev/fd/5
  # The quoting on '_EOF_' prevents the shell from expanding the contents of the heredoc,
  # as if it were a big double quoted string. So, your $2, $3, etc. are safe.
gawk -f <(cat - <<-'_EOF_'
    BEGIN{
        printf("%s:%s:%s:%s:%s:%s:%s\n", "index", "total", "used", "free", "cached", "buffers", "cache")
    }

    /^#/{
        gsub("#", "")
        printf("%d:", $0+1)
    }

    /^M/{
        printf("%d:%d:%d:%d:", $2,$3,$4,$7)
    }

    /^-/{
        printf("%d:%d\n", $3, $4)
    }
_EOF_
) realmap.log | column -ts: > realmap.csv

gnuplot <<-_EOF_
    set term png
    set out 'realmap.png'
    set xlabel 'index'
    set ylabel 'bytes'
    set style data lp
    plot 'realmap.csv' u 1:2 t col, '' u 1:3 t col, '' u 1:4 t col, '' u 1:5 t col, '' u 1:6 t col, '' u 1:7 t col
_EOF_

rm realmap.csv

display realmap.png

Então essa é a resposta que você pediu. Agora, a maneira que eu faria é com o que chamo de padrão de script de consumo próprio.

#!/bin/bash

  # The <( begins a process substitution. It's valid to use with -f because what gets
  # substituted is a file descriptor like /dev/fd/5
  # Notice the use of brackets. That prevents the following line from matching itself.
gawk -f <(sed -e '/[B]EGIN_AWK1/,/[E]ND_AWK1/!d' $0) realmap.log | column -ts: > realmap.csv

gnuplot <<-_EOF_
    set term png
    set out 'realmap.png'
    set xlabel 'index'
    set ylabel 'bytes'
    set style data lp
    plot 'realmap.csv' u 1:2 t col, '' u 1:3 t col, '' u 1:4 t col, '' u 1:5 t col, '' u 1:6 t col, '' u 1:7 t col
_EOF_

rm realmap.csv

display realmap.png

exit  ## Execution stops here. The rest is consumed by subprocesses of this script!

#BEGIN_AWK1
    BEGIN{
        printf("%s:%s:%s:%s:%s:%s:%s\n", "index", "total", "used", "free", "cached", "buffers", "cache")
    }

    /^#/{
        gsub("#", "")
        printf("%d:", $0+1)
    }

    /^M/{
        printf("%d:%d:%d:%d:", $2,$3,$4,$7)
    }

    /^-/{
        printf("%d:%d\n", $3, $4)
    }
#END_AWK1

Para mim, é muito fácil de seguir e você pode colocar vários AWK ou outros scripts em um arquivo, incrementando o delimitador.

Aproveite o bashing! Sinta-se à vontade para entrar em contato com #bash no freenode para obter respostas ainda mais rápidas.

Para mais informações, consulte o link

    
por 22.06.2012 / 08:58

Tags