AWK - Manipulação de arquivos de texto
Nesse artigo quero mostrar como trabalhar com manipulação de arquivos de texto. Para isso vou utilizar uma linguagem desenvolvida especificamente para esse tipo de trabalho. Essa linguagem é a AWK, ela foi criada em 1977 pelos cientistas Alfred Aho, Peter J. Weinberger e Brian Kernighan no laboratório Bell Labs.
Parte 2: Em forma de script
O exemplo anterior já ficou bem grande, e obviamente, quanto mais complexo, maior o comando. Para facilitar a escrita e a legibilidade, é possível utilizar a AWK em forma de script, para isso, basta criar um arquivo que inicie com a linha "#!/usr/bin/awk -f" e escrever os comandos nas linhas seguintes.
O exemplo anterior escrito em forma de script fica assim:
Nesse exemplo foi utilizada a variável padrão FS no lugar no parâmetro "-F". Nessa variável é armazenado o delimitador que será utilizado no script, ela deve ser definida no bloco BEGIN.
Para executar esse script, é necessário que o arquivo tenha permissão de execução. O comando chmod +x teste.awk marca o script com permissão de execução para todos os usuários. Para executar basta escrever no terminal:
./teste.awk $HOME/passwd
Seguindo com os exemplos, agora vou mostrar apenas as linhas onde o login tenha menos de 4 letras:
Nesse exemplo utilizei a função "length", que retorna o tamanho de uma string. Veja outras funções do AWK:
AWK também têm funções para trabalhar com números, alguma delas são:
No próximo exemplo, vou redirecionar a saída para um arquivo e vou alterar o shell de todos os usuários que usam o /bin/sh para o /bin/bash, afinal, o bash é o melhor. :)
Obs. 1: a AWK também possui uma instrução while, que assim como o for tem uma sintaxe idêntica a do C.
Obs. 2: os comentários em AWK são feitos com #.
O exemplo anterior, foi escrito ao estilo C propositalmente, para mostrar como utilizar a instrução for... O jeito AWK de fazer isso é utilizando a função gsub, veja:
Bem melhor, não acham?
Tem muito mais para mostrar sobre o AWK, mas espero que isso seja o suficiente para ajudar alguém.
Artigo também publicado em:
O exemplo anterior escrito em forma de script fica assim:
#!/usr/bin/awk -f
BEGIN {
FS=":";
}
{
if( $7 == "/bin/bash") {
printf "%s usa o shell %s \n", $1, $7;
total++;
}
}
END {
printf "Total de registros %d \n", total
}
Nesse exemplo foi utilizada a variável padrão FS no lugar no parâmetro "-F". Nessa variável é armazenado o delimitador que será utilizado no script, ela deve ser definida no bloco BEGIN.
Para executar esse script, é necessário que o arquivo tenha permissão de execução. O comando chmod +x teste.awk marca o script com permissão de execução para todos os usuários. Para executar basta escrever no terminal:
./teste.awk $HOME/passwd
Seguindo com os exemplos, agora vou mostrar apenas as linhas onde o login tenha menos de 4 letras:
#!/usr/bin/awk -f
BEGIN {
FS=":";
}
{
if( length( $1 ) < 4) {
printf "%s \n", $1;
total++;
}
}
END {
printf "Total de registros %d \n", total
}
Nesse exemplo utilizei a função "length", que retorna o tamanho de uma string. Veja outras funções do AWK:
- index( s1, s2 ) - retorna a posição da string s1 na string s2
- gsub( sO, sS, s ) - substitui a string original sO pela a string substituta sS na string s
- length( s ) - retorna o tamanho da string s
- split( s, v, d ) - quebra a string s usando o delimitador d e coloca no vetor v
- substr( s, i, f ) - retorna a parte da string s que inicia na posição i e termina na posição f
AWK também têm funções para trabalhar com números, alguma delas são:
- sqrt( n ) - raiz quadrada
- sen( n ) - seno
- cos( n ) - cosseno
- int( n ) - a parte inteira de n
No próximo exemplo, vou redirecionar a saída para um arquivo e vou alterar o shell de todos os usuários que usam o /bin/sh para o /bin/bash, afinal, o bash é o melhor. :)
#!/usr/bin/awk -f
BEGIN {
FS=":";
}
{
if( $7 == "/bin/sh") $7 = "/bin/bash";
for( i = 1; i < 8; i++ ) printf "%s:", $i >> "bkp";
print "" >> "bkp"; #pra quebrar a linha
}
Obs. 1: a AWK também possui uma instrução while, que assim como o for tem uma sintaxe idêntica a do C.
Obs. 2: os comentários em AWK são feitos com #.
O exemplo anterior, foi escrito ao estilo C propositalmente, para mostrar como utilizar a instrução for... O jeito AWK de fazer isso é utilizando a função gsub, veja:
#!/usr/bin/awk -f
{
gsub( "/bin/sh", "/bin/bash", $0 )
print $0 > "bkp"
}
Bem melhor, não acham?
Conclusão
Pessoal, por agora é isso.Tem muito mais para mostrar sobre o AWK, mas espero que isso seja o suficiente para ajudar alguém.
Artigo também publicado em: