Você está na página 1de 4

INSTITUTO SUPERIOR DE CINCIAS DO TRABALHO E DA EMPRESA

Sistemas Operativos ETI - IGE

2 Semestre 2005/2006

Sed e Awk

Os comandos: sed e awk.


1. sed e expresses regulares
a) Alguns comandos do Unix so especialmente importantes quando se trata de scripts; Um desses comandos o sed, que introduz tambm a noo de expresses regulares; Essencialmente, o sed l uma entrada e produz uma sada transformada; A transformao a fazer indicada num comando dado como argumento sed; H duas transformaes importantes: - Seleccionar parte das linhas do ficheiro original; - Substituir parte do texto do ficheiro original; b) o seguinte comando selecciona as linhas do ficheiro /etc/passwd que contm a palavra root; > sed -n '/root/p' /etc/passwd A opo -n faz com que o sed reproduza apenas as linhas em que isso pedido explicitamente; neste caso aparecem apenas as linhas seleccionadas pelo comando que tem a forma: /expresso-regular/p o efeito deste comando escrever (o "p" de print) as linhas que aderem expressoregular indicada; neste caso aderem expresso regular as linhas contendo a palavra indicada; c) Numa expresso-regular podem-se usar smbolos com significado especiais que permitem bastante flexibilidade na localizao de sequncias de texto; essa simbologia resume-se na seguinte tabela: * ? ^ $ [] \x Qualquer sequncia de caracteres; Um caracter qualquer Incio da linha Fim da linha um dos caracteres indicados; escape de um caracter especial; ex \$ para representar o caracter $

d) Os [ ] denotam um caracter, dentro dos indicados na lista; Por exemplo [abc] denota um caracter, que seja a ou b ou c; Na lista podem figurar intervalos; ex: [a-z] denota uma letra minscula e [a-zA-Z] uma letra qualquer; O smbolo ^antes da lista denota todos os caracteres menos os indicados; ex: [^abc] qualquer caracter que no seja o a ou b ou c; ex: [^a-b] qualquer caracter que no seja uma letra minscula;

e) Exemplos: ^a localiza as linhas comeadas por a (ie: contendo a sequncia "incio da linha a"); a$ as linhas terminada em a (ie: contendo a sequncia "a fim de linha"); [abc] um a ou um b ou um c; ^[0-9] Comeadas por algarismo; ^?$ contendo apenas um caracter; ^[a-zA-Z]$ linha contendo apenas uma letra; *Maria* a palavra Maria [Mm]aria a palavra Maria ou a palavra maria d) Exemplos Listar apenas as directorias > ls -l | sed -n '/^d/p' Listar os ficheiros executveis > ls -l | sed -n '/^??x??x??x/p' e) O comando seguinte exemplifica a utlizao do sed para transformar o contedo de um ficheiro: > sed 's/a/Aluno/' /etc/passwd Neste caso o comando para o sed s/a/Aluno e tem como efeito substituir a por Aluno; (como evidente, o sed no altera o ficheiro; apenas o l e mostra o seu contedo transformado);

f) Este comando sed tem a forma geral: s/expresso-1/expresso-2/ e tem como efeito substituir a expresso-1 do texto original pela expresso-2; (s/expresso-1/expresso-2/g para substituir todas as ocorrncias de expresso-1 na mesma linha);

2. awk
a) O awk um comando muito amplo que engloba, ele prprio, uma linguagem para programao de scripts de manipulao de texto; vamos apenas algumas construes simples/tpicas com awk; b) O exemplo seguinte mostra apenas uma parte (2 das colunas) do resultado do comando ls l; > ls -l | awk ' {print $1 $3 ; }' a exemplo do sed, tambm o awk aceita um "comando" passado como argumento; o comando indicado entre { } e contm uma ou mais instrues, que terminam com ; Neste caso a instruo o print que "imprime" no ecr; o que importa aqui o facto de o awk, ao processar cada linha, dividir os campos (separados por espaos) em variveis $1 $2 etc; assim, ao escrever estas variveis, estamos a escrever as colunas 1 e 3 do resultado do ls -l; c) O exemplo anterior imprime todas as linhas; uma variante um comando da forma: /expresso-regular/ { comandos } que aplica o bloco de comandos apenas linhas seleccionadas pela expresso-regular; ex: > ls -l | awk '/^d/ { print $1 $3 }' Mostra o mesmo contedo mas apenas para os directrios;

d) possvel associar um bloco de comandos a diferentes condies de seleco; por exemplo: > ls -l | awk ' /^d/ { print $1 $3; } /^-/ { print ficheiro $2; } ' Trata de forma diferente directrios e ficheiros comuns; e) ainda possvel associar um bloco de comandos a uma situao especial, denotada pela marca BEGIN que ocorre antes da leitura de entrada; isto til para fixar alguns parmetros importantes como o FS que indica o caracter de separao dos campos: ex: > cat /etc/passwd | awk ' BEGIN { FS=":" ; } { print $1 $5; } ' Mostra o nome e descrio de cada utilizador (colunas 1 e 5 do ficheiro /etc/passwd);

3. Exemplos
a) Muitas vezes preciso extrair contida do "meio" de uma linha; ex: pretendemos apurar o tamanho de um ficheiro e para isso decidimos usar uma das colunas do ls -l que d essa informao (coluna 5); uma das maneiras mais simples usar o awk: #!/bin/bash t=`ls -l /etc/passwd | awk {print $5; }` echo "o tamanho de /etc/passwd $t"

b) Em alternativa podemos sempre recorrer s vastas possibilidades da shell para separar listas de palavras; uma das possibilidades o for #!/bin/bash t=`ls -l /etc/passwd` i=1 for c in $t ; do coluna[$i]=c i=$(( $i + 1)) done echo ${coluna[5]}

c) A localizao de uma varivel de posio fica muito simples quando esto envolvidos argumentos: ex: usar uma funo #!/bin/bash doit () { echo $5 } t=`ls -l /etc/passwd` doit $t

d) Mais simples: #!/bin/bash t=`ls -l /etc/passwd` (set - $t ; echo $5)

Você também pode gostar