Mostrando postagens com marcador awk. Mostrar todas as postagens
Mostrando postagens com marcador awk. Mostrar todas as postagens

Awk: como imprimir os registros que contenham um determinado padrão?

Imagina que você tem um arquivo assim

E deseja imprimir os blocos (Registros) em que o campo
3 "Last Result:" não termine com zero

A solução em awk fica assim

awk 'BEGIN {RS="";FS="\n"} {if ($3 ~ /[^0]$/) print $0,"\n"}' teste.txt
 
Explicação 
BEGIN ..... preprocessamento do awk, nesta seção alteramos coisas como...
RS ........ Separador de registros o padrão é "\n"
FS ........ Separador de campos o padrão é espaço
 
Com a mudança acima é como se cada bloco estivesse numa horizontal e a separação dos mesmos passou a ser uma linha em branco No final jogamos um if no qual  testamos através de expressões regulares se o campo $3 não termina com zero,
 
if ($3 ~ /[^0]$/) 
 
e finalmente mandamos imprimir 
o registro todo $0
print $0,"\n" 
 
A impressão de uma quebra de linha "\n" 
é para no caso de a saida gerar vários 
registos que eles fiquem separados como no início.

Gimp Tutorial: Bokeh Effect

Aqui o meu video: http://www.4shared.com/file/lgwABZNX/gimp-bokeh-efect.html
Postei no blip.tv neste link: http://blip.tv/file/4037720





Usando este tutorial criei este papel de parede

Gimp bokeh efect by ~voyeg3r on deviantART

Para pegar sua resolução de tela, para fazer o wallpaper correto faça:

xrandr | awk -F"," '/^Screen 0/ {print $2}'


Veja também: Recorte de cabelos com o gimp

Bash: melhorando a complementação de comandos


sudo su -
# bash completion
linha=`awk '/enable bash completion/ {print NR}' /etc/bash.bashrc`
sed -i.backup "$((linha+1)),$((linha+3))s/^#//g" /etc/bash.bashrc

# uma vez configurado você pode por exemplo ver as opções do find assim
find -[tab][tab]

sudo apt-get install -y bash-completion-lib
sudo apt-get install -y python-optcomplete

# complementos para django: http://djangoadvent.com/1.2/improved-bash-completion/
# baixe este arquivo
# e insira também no ~/bashrc
if [[ -f ~/bin/django_bash_completion ]]; then
. ~/bin/django_bash_completion
fi

Esta informação também foi compartilhada aqui: http://ur1.ca/0zsee
Um artigo sobre complementação do Django.
Artigo do Eustáquio Rangel sobre a complementação de comandos do git

Artigo em ingles sobre completion http://aplawrence.com/Unix/customtab.html
other http://www.oreillynet.com/linux/blog/2007/02/improving_bash.html
more here.

Video do Linux Journal


Um script para incrementar as coisas, desse cara.

bash - script para estudo

O script abaixo mostra o espaço usado em disco na forma de percentagem, faz uso do awk


Explicação


Visite o site original: http://www.bashscripts.info/

Como pegar o ip de uma máquina pelo MAC?

Instale o arp-scan e use assim:

rode como root!

arp-scan -l | awk '/00:40:a7:0d:cf:fb/ {print $1}'

Concatenando linhas com o awk

O problema surge na lista sed-br:
http://br.groups.yahoo.com/group/sed-br/message/4369

A descrição do mesmo

Senhores,
Ainda não consegui achar uma solução, tem um arquivo que ele assim:

dn: uid=xx,ou=Usuarios,dc=bbbb,dc=com,dc=br
cn: fulano de tal
homePhone: 053922
mail: fulano@...
dn: uid=yy,ou=Usuarios,dc=bbb,dc=com,dc=br
cn: beltrano de tal
homePhone: 053923
mail: beltrano@...

Isso se repete, sempre, dn:, cn: homePhone: e mail:, gostaria de deixar
ele dessa forma:

dn: uid=xx,ou=Usuarios,dc=bbbb,dc=com,dc=br;cn: fulano de tal;homePhone:
053922

em coluna para cada 4 linhas do arquivo. Alguém tem alguma idéia de como
fazer isso?


A solução ...

awk 'ORS=NR%4?",":"\n"' file

# a atribuição do "separador de registro de saída" ORS tem um opcional
# que pode ser virgula ou quebra de linha "\n", para ser quebra de linha necessita
# que o valor seja um número que dividido por 4 dê resto zero, na prática
# o awk vai concatenar de 4 em quatro linhas colocando uma virgula entre "linhas"

Divertindo-me com o awk


echo "Enter ID: "
read ID
awk -v ID=$ID 'NR==14{ print ID}{print}' "file"

# assim dá pra usar o argv para passar alguns parâmetros no script

awk 'BEGIN {print ARGV[5]}' 1 2 3 4 5 6 7

awk 'BEGIN {print ARGV[5] "\n" ARGV[3]}' 1 2 3 4 5 6 7

awk -v sq=`pwd` 'BEGIN {print "você está em " sq}'

Probleminha com awk

Imagine que você tem este arquivo:

-5232,-92338,84545,34
-2233,25644,23233,2
6211,-1212,4343,43
-2434,621171,9121,-33

E deseja mostrar apenas os valores negativos

awk 'BEGIN {RS=",|\n"}; /^-/ {print}' file.txt

Indicamos duas alternativas para o Separador de Registros, vírgula ou quebra de linha ", | \n" assim ele considera cada valor como sendo uma linha, em seguida usamos uma expressão regular para pegar o começo de linha com o sinal de menos.

A inspiração para este post veio deste excelente blog.

Como funciona o awk

Bem, este post veio por causa deste comentário.

De forma simples o awk trata textos e streams assim:

awk [padrão] ação

Observe que o padrão pode ser omitido, caso queira usar o padrão pode usar expressões regulares

Vamos aos exemplos:

echo "um dois" | awk '{print $2}'

omitimos o padrão, ou seja pedimos apenas a ação, no caso imprimir a segunda coluna

echo "um dois" | awk '{print $2, $1}'

Acima pedimos ao awk que invertesse a posição das colunas

awk -F: '/sergio/ {print $1}' /etc/group

Acima algo novo (o separador de campos padrão do awk é o espaço) para indicar
um separador diferente usamos '-F' seguido do separador. Estamos pegando o campo 1 do
arquivo /etc/group, estamos pedindo que imprima somente as linhas que contém o padrão sergio. /sergio/

Para imprimir somente as linhas pares

seq 10 | awk '$1 % 2 == 0 {print}'

Como pegar o endereço IP?

ifconfig eth0 | awk '/inet addr/ {print $2}'

Se desejar limpar mais a saida pode usar o cut

Como pegar usuários com GID acima de 1000

awk -F: '$4 > 1000 {print}' /etc/passwd

Acima estou dizendo ao awk que o separador de campos é dois pontos e que
se o campo 4 for maior que 1000 o mesmo deve ser impresso

Como pegar a segunda coluna da quinta linha?
Considrando que o arquivo seja separado por espaços, faça:

awk 'NR==5 {print $2}' arquivo

Algon novo aqui --> NR significa número do registro, para o awk cada linha
é um registro, portanto 5ª linha é igua a NR==5

procura e mostra linhas com o terceiro campo igual a "peter" ou que contenham o string "marie":

cat nomedoarquivo | awk '$3 == "peter" || $3 ~ /marie/'

Variáveis do awk
NR Contém o número do registro atual
NF contém o número de registros por campo
FS indica o separador de campos
RS indica o separador de registros
OFS indica o separador de campo do arquivo de saida
ORS indica o separador de registros do arquivo de saida

indicando o separador de saída

awk -F: '{OFS="-"}{print $1,$6}' /etc/passwd

Imprimir o nome dos grupos que tiverem como membro o usuário sergio

awk -F":" '$4 ~ /sergio/ {print $1}' /etc/group

Imprimir cada registro (linha) numerada "NR" usando Número do Registro

awk -F":" '{ print NR " " $0 }' /etc/passwd

Script para pegar hostnames do windows

#!/bin/bash
# Criado em:ter 04/nov/2008 hs 08:34
# Last Change: Ter 04 Nov 2008 11:06:02 BRT
# Instituicao: funcet
# Proposito do script: pegar hostnames
# Autor: Sérgio Luiz Araújo Silva
# site: vivaotux.blogspot.com

> hosts.txt
echo " preparando a lista de hosts ativos..."
faixa=$(nmap -sP 172.35.34.1-254 | awk '/^Host/ {print $2}')
echo
echo " lista de ips ativos criada..."
echo
for i in $faixa; do
echo " obtendo hostname de $i"
nome=$(nmblookup -A $i | awk 'NR==2 {print $1}') 2>&1>> /dev/null
if [ ! $nome == 'No' ]; then
echo "$i $nome" | tee -a >> hosts.txt
else
echo "não foi possível obert o nome para $i"
fi
done

# para ler todas as dicas que postei sobre shell script / bash acesse:
# http://vivaotux.blogspot.com/search/label/bash

Como saber quais hosts ativos em uma rede?

Essa é moleza:

nmap -sP 172.35.34.1-254 | awk '/^Host/ {print $2}' >> relatorio192.txt

Usando -sP o nmap apenas dá um status, caso o host esteja ativo
ele vai ser jogado para o arquivo relatório.txt
Podemos formatar a saida na tela assim:

nmap -sP 192.168.254.1-254 | awk '/^Host/ {print $2" ativo"}'

Melhor ainda dá pra colocar no ~/.bashrc

hostsativos (){
nmap -sP 192.168.254.1-254 | awk '/^Host/ {print $2" ativo"}'
}

agora basta digitar no terminal 'hostsativos'





Pretendo em breve melhorar a função acima para torna-la 
independente de rede, pegando a poração de rede do seu ip atual 
e jogando numa variável a ser usada pelo awk.


Para contar quantos computadores você tem na rede faça:
nmap -sP 192.168.254.1-254 | awk '/^Host/ {print $2" ativo"}' \
| wc -l


Para quem não tem nmap ou arp-scan instalados


Um brinde: manual do nmap em português:

Qual o arquivo mais antigo da pasta atual?

ls -t | tail -1

A opção '-t' lista por tempo do mais novo para o
mais antigo, já o comando tail com opção '-1' listará
a última linha, ou seja o arquivo mais antigo da
pasta atual.

Só há um porém: O comando acima pega pastas e arquivos
para pegar somente arquivos faça:

ls -lt | grep '^-' | awk '{print $8}' | tail -1

Jogando em uma variável (sem grep pega pastas também)

oldest=$(ls -lt|tail -1|awk '{print $NF}')

" Se você tem uma maçã e eu tenho uma maçã e, em seguida, trocarmos as
maçãs, eu e você ainda teremos uma maçã cada um. Mas se você tem uma idéia e
eu tenho uma idéia e trocarmos essas idéias, então cada um de nós terá duas
idéias. "

Calculando sua fatura com o awk

Eu tenho uma fatura assim:

Obs: os espaços do segundo campo foram trocados por "_"

12/01/2007 INSINUANTE_LJ_187(12/12) 187,91
04/09/2007 RABELO_SOM_E_IMAGEM(04/12) 51,75
03/11/2007 EXTRA_1375_PARANGABA(03/04) 41,75
03/11/2007 EXTRA_1375_PARANGABA(03/04) 11,75
13/11/2007 INTUICAO(02/02) 34,50
21/11/2007 ADAUTO_PECAS(02/06) 200,00
17/12/2007 ANUIDADE(12/12) 7,00
26/12/2007 VIACAO_ITAPEMIRIM(01/03) 259,34

awk '{ total = total + $3} END {print total} ' fatura.txt


Resultado:
794

AWK: Adicionando linhas em branco a cada 10 linhas

Link original aqui.
Testei o comando abaixo com êxito, cumprindo a função de
colocar um espaço a cada 10 linhas.

awk '{ print } NR % 10 == 0 { print "" }' input


Dicas do vim novamente?

'0 ...................................... abre o último arquivo editado
control-w-n ....................... abre uma nova janela
control-w-q ....................... fecha a janela atual (caso esteja salvo o arquivo)
control-w-j ....................... vai para a janela imediatamente abaixo
control-w-k ....................... vai para a janela imediatamente acima
control-w-+ ....................... aumenta o tamanho da janela atual

Uma dica legal para substituição
:/joao/,/pedro/s/casa/residência/g

comando ":" de /joão/ até /pedro/
substitua "s" /casa/ por /residência/

Se estiver no modo insert e quizer repetira a linha de baixo use
control-e
Para repetir a linha de cima
control-y

:s/fred/control-r-a/g : substitui "fred" pelo conteúdo do registro "a"

conrtol-r-% ............. insere o nome do arquivo

conrtol-r-/ ............... insere a última busca

conrtol-r- ............... insere o último comando

conrtol-r- ............... repete o último insert


usando // repetimos a última busca
:%s//aquilo/g


Trocando colunas de lugar
:18,23! awk '{print $2,$1}'

Usando o awk dentro do vim para gerar subtotais

item unitário quantidade subtotais
001 15 25
002 23 15
003 45 50

Para gerar a coluna com os subtotais
:19,21! awk '{print $1" "$2" "$3" "$2*$3}'

no caso acima o awk imprime o campo $1, $2 e $3 com espaços " " no meio
e no final multiplica o valor unitário "campo $2" pela quantidade "campo $3"
criando a quata coluna com os subtotais.

linux-cookbook

Grupos do Google
Participe do grupo linux-cookbook
E-mail:
Visitar este grupo