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

Bash: Um script para interagir com o comando bc

O comando bc, ou "an arbitrary precision calculator language" é bastante precisa desde que o usuário use a opção scale=2, onde 2 corresponde à precisão do calculo pedido. Outro problema é que você tem que entrar literalmente no bc para interagir com ele, mas no site do LinuxJournal[1] há um artigo sobre como interagir com o bc de forma transparente. Na minha ânsia por aprendizado sobre shell script criei o script abaixo que tenta trazer uma solução para o problema baseado no referido artigo, só que eu estou com um problema, estou sem computador, e no trabalho só tem a porcaria do windows, gostaria que a galera olhasse esse código, testasse e também propusesse soluções similares ou melhores, tipo uma calculadora em python para a linha de comando com a qual pudéssemos interagir e usar em outros scripts, segue portanto o script:



1 - http://www.linuxjournal.com/article/9891

Bash: Checking Availability of commands

Uma tarefa comum no dia-a-dia de quem faz scripts e testar a existência de comandos, fuçando pela Internet descobri o comando hash que tem a vantagem de ser built-in, ou seja faz parte do próprio bash


Referências:

http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script 
http://wiki.bash-hackers.org/scripting/style

Sed - ame-o ou deixe-o

separando o ultimo campo de um caminho

O problema

Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas
 
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
 
preciso separar o que é o full path e o que é o arquivo. Tipo:
 
full=/dados/teste/uu/
arq=eu.sh
 
full=/dados/eu/
arq=eu.log
 
e por ai vai.

A solução

sed -i.backup -r  's,(.*/)(.*),full=\1 \narq=\2,'  arquivo
use '-i' para alterar diretamente o arquivo com o sed, com 
-i.backup ele gera um backup antes
 
 
troquei o delimitador para não confundir com as barras 
veja  sed -
 
r ............. expressões regulares extendidas
(.*/) ......... grupo 1 tudo até a ultima barra
(.*) .......... grupo 2 nome do arquivo
\1 ............ coloca o grupo 1 no local indicado
\2 ............ coloca o grupo 2 no local indicado
\n ............ note o \n antes de 'arq='

Bash: Testando strings

Para testar se uma string é vazia:

test -z "string" # testa string
echo $? # retorna 1 para string não vazia
1 # valor de retorno, indica que a string não é vazia

test -n "string" # testa se a string é "não vazia"

Podemos usar um par de colchetes "[ ]" substituindo assim o nome 'test' e um opcional "||"

[ -z "string" ] || echo "string não vazia"

# ou a pasta existe ou será criada dinamicamente, no final acabamos dentro dela.
[ -d casa ] || mkdir casa ; cd casa


uma lista bem completa de opções que peguei aqui:
Testes em variáveis:

-lt Número é menor que (LessThan)
-gt Número é maior que (GreaterThan)
-le Número é menor igual (LessEqual)
-ge Número é maior igual (GreaterEqual)
-eq Número é igual (EQual)
-ne Número é diferente (NotEqual)
= String é igual
!= String é diferente
-n String não é nula
-z String é nula


Testes em arquivos:

-d É um diretório
-f É um arquivo normal
-s O tamanho do arquivo é maior que zero
-r É arquivo tem permissão de leitura
-w O arquivo tem permissão de escrita
-nt O arquivo é mais recente (NewerThan)
-ot O arquivo é mais antigo (OlderThan)
-ef O arquivo é o mesmo (EqualFile)


este recurso é bom para o caso em que você quer testar uma variável e caso não exista
tal valor você pode defini-lo, no caso abaixo fazemos melhoramentos no ~/.bashrc de modo
a habilitar o "ignore-case" bash completion, a possibilidade de usar apenas um [TAB] na complementação de comandos bem como a correção do nome de pastas digitados com pequenos erros
no comando cd.

No script abaixo, se o grep retornar vazio ele colocará as opções
no ~/.bashrc


Evitando erros no comando teste - sempre coloque sua string entre aspas
avoid erros.
Always put your string between quotation marks

Observe que a string que está sendo testada deve estar dento de aspas duplas ou simples, já que o comando test, veja que o comando grep está envolvido em crases fazendo o que chamamos de
`substituição de processos`, retornando na sua posição a saida do comando propriamente dito, tudo isto é então envolvido em aspas duplas.

Vejamos um exemplo em que a falta de apas gerou um erro:
http://www.mail-archive.com/redhat-list@redhat.com/msg69853.html

O erro citado no link acima foi:
./test.sh: [: too many arguments

O motivo é simples o comando test recebe apenas um parâmetro e o camarada estava fazendo assim:

if [ -n `mount |grep "/mnt/root/cschomeserver/e"` ] #if it's already mounted don't
mount it
then PREMOUNTED='YES' && echo "is mounted" #If it's already mounted set a var
else echo "mount /mnt/root/cschomeserver/e is not mounted" #if it's not mounted,
mount it.
fi

Note que o comando 'mount' jundo com o redirecionamento provavelmente retornará várias colunas
e que as mesmas não estão englobadas entre aspas. Compare com o nosso exemplo acima.

Dicas do comando date no meu wiki

Querido comando date, me diga o nome do dia da semana de dois dias atráz

date --date='2 days ago' +%A

O date também lhe diz se hoje é o último dia do mês

[ `date --date='next day' +'%B'` == `date +'%B'` ] || echo 'end of month'

Adiante o relógio do sistema em 30 minutos

# date --set='+30 minutes'


Bom, visitem o wiki neste link: http://linuxdicas.wikispaces.com/date. ou http://linuxdicas.wikispaces.com/comandos-linux

Sed - Formatando campos de datas

Perguntinha postada no grupo sed-br no yahoo:

Pessoal,
Tenho um arquivo com formato de data que esta da seguinte maneira

2009-09-29
20090813
20070715
2008-09-15

e quero que ele tenha os hifens "-" onde nao tem, pra sair com a seguinte
formataçao:

2009-09-29
2009-08-13
2007-07-15
2008-09-15


Agradeço desde ja,
Moroni Vieira


My solution:

sed -i.backup -r 's/(^[0-9]{4})-?([0-9]{2})-?([0-9]{2})$/\1-\2-\3/g' file

Os díditos são agrupados entre parênteses para poder-mos usar os retrovisores, ou back reference \1 \2 \3, já os hifens são opcionais por conta da
interrogação. OBS: Para não ter que usar um monte de escapes "\" use a opção '-r' do
sed.

tar - extraindo somente um arquivo

Se você tem um pacote tar.gz assim:


pacote.tar.gz ---> pasta/arquivo.sh

Para extrair somente o arquivo faça:

tar zxvf pacote.tar.gz --strip 1


Referências: http://serverfault.com/questions/30485/un-tar-a-specific-directory-inside-of-a-tar

txt2html.sed by Thobias Salazar Trevisan

Achei muito legal e resolvi compartilhar com vocês, um script sed que converte arquivos txt em páginas html. http://thobias.org/bin/txt2html.sed.html

Não deixe de olhar o link bin do mesmo autor:
http://thobias.org/bin/

manpages coloridas



Fonte: http://tuxarena.blogspot.com/2009/06/6-bash-productivity-tips.html

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.

RT Calculadora no #bash

Este post está com cara de #twitter poque foi pego de lá, como tudo que posto aqui vai pra lá também ...

@jfca_ca Create an Awesome Command Line Calculator http://bit.ly/36JUKv (via feedly) #bash

que tal fazer um calculo assim no bash?

image

basta salvar no ~/.bashrc



Testando seu comando antes de executa-lo com o echo

Eu queria fazer uma remoação e resolvi testar antes
echo conf-sys.[2-3]*
depois fiz apenas a substituição do echo pelo "rm -f"
^echo^rm -f
Outra dica legal é colocar comentários nos comandos complicados, isso mesmo, direto no prompt do bash. Mas em que isto lhe ajuda? Vou dar um exemplo.

speaker-test -twav -c2 # consertando o som no ubuntu

Se amanhã eu não lembrar o nome "speaker-test..." bastará fazer
history | grep ubuntu

Doses homeopáticas de shell script

Como eu faço para ver, e tão somente ver, como foi a execução do meu ultimo rsync sem que eu tenha que usar o history | grep rsync?

!rsync:p

Se eu digitei:

rsync -avz --update --delete ./ coordenador@10.3.0.154:/home/coordenador/dvd-viagem/

e o ip da máquina não terminava com 154 como trocar por 175?

^154^175





Veja também como habilitar o magic space no bashrc

Apagando arquivos de hoje de uma pasta

Sei que a maioria dos leitores do blog já sabem usar o find com todas as suas firulas, mas vez por outra devemos dar uma colher de chá para os novatos, não é mesmo?

find ./ -ctime -1 | xargs rm -rf


Lembre-se que este comando é recursivo, caso não deseje este comportamento faça assim

find ./ -maxdepth 1 -ctime -1

No caso acima não estou apagando mas apenas listando o que foi criado hoje
e tão somente na pasta atual, a opção "-maxdepth" controla o nível de profundidade sobre o qual o find vai atuar.

Obs: se você omitir o caminho de buscas o find irá buscar na pasta atual, outra coisa, se não estiver lembrando como se escreve uma opção o find tem um "table complete" interno, ou seja, se você digitar -max[tab] elel digita o restante pra você.

linux-cookbook

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