Jul 09, 2015
Aprenda os atalhos CLI
O básico já ajuda muito!
Final da linha: CTRL+eInício da linha: CTRL+aRemover palavras a esquerda: CTRL+wRemover palavras a direita: CTRL+u
Só isso?! [tips]
Nem tudo é o que parece Ao remover uma palavra(ou conjunto
de), na verdade você a salvou num buffer, que poderá ser resgatado com CTRL+y, Ex:
# cp arquivo.txt /path/gigante/novo.txt # <UP><CTRL+w><DOWN> # vi <CTRL+y>
[tips]
Pesquisar o histórico com <CTRL+r> Para continuar a pesquisar continuar
pressionando r sem soltar o <CTRL>
CTRL+t: corrigir erros corriqueiros de digitação, como: iv<ctrl+t> => vi
Continuando...
Você costuma esquecer sempre que precisava ter usado o sudo e agora vai ter que digitar tudo novamente com o sudo, ou subir o cursor, CTRL+a e digitar o sudo novamente. Da pra ser mais prático?
tricks
# cat /etc/shadowcat: /etc/shadow: Permissão negadamagno@magno ~ $ sudo !!sudo cat /etc/shadow[conteúdo]
Mais um [trick] CLI de bônus
É muito comum precisar usar o último parâmetro usado anteriormente.
Segue a bruxaria, ex:# grep ^tecktalk: /etc/passwd# cat [ESC] . => cat /etc/passwd
Quantos números 9 existem entre 1 a 100?
noves=\
$(echo -n \
$( grep 9 <( for ((i=1;i<100;i++))
do
echo $i
done
)
) | sed 's/[^9]//g'
)
echo ${#noves}
Stream file [trick]
Muitos comandos exigem arquivos, como o diff. Seria bom o diff diferir entre outputs de 2 comandos, certo?!
Seus problemas acabaram! Chegou o file(stream) tabajara! ;-)
# cat <(ls|head -1)01.jpg# ls -la <(ls|head -1)lr-x------ 1 ... /dev/fd/63 -> pipe:[11525029]
Vim|Diff [trick & tips]# < <(tail -10 nomes.txt) grep maria
# diff <(cd a; ls|sort ) <(cd b; ls|sort )
# diff dir1 dir2 => compara diretorios
#diff -r dir1 dir2 => recursivamente(-r)
GREP
Um dos primeiros comandos que a gente aprende a usar... e sempre esquecemos o poder que o mesmo tem.
Forma pouco otimizada para pesquisar por uma linha com “Maria qquer coisa Jose”, dando falsos positivos como “Jose qqer coisa Maria”:
# grep Maria nomes.txt | grep Jose
Forma inteligente
# grep “Maria.*Jose” nomes.txt
Nunca esqueça! GREP trabalha com REGEXP! Shell NÃO!!!
No shell * = qualquer caracter, 0 ou mais Em REGEXP é: .* ou .+
[trick]
Não sou fã de ficar turbinando, criando alias exóticos que não vai usar em outro linux... Sou da filosofia KISS
Mas no caso do grep... tem um tip que sempre gosto de aplicar e alguns linux já aplicam isso como Gentoo ;-)
# grep –color # egrep –color Este trick é ótimo para testar uma RE
OR no grep e fgrep
O operador Rexp OR pede um grep com esteróides:
egrep “Maria|Jose” nomes.txt grep -E Maria\|Jose nomes.txt egrep -i 'MaRIa|Jose' nomes.txt fgrep -i “Maria Jose” nomes.txt
Grep [tips]
Se alguém aqui parar de usar o wc junto com o grep este tecktalk já terá valido a pena!!! :-)
# grep fulano nomes.txt|wc -l # grep -c fulano nomes.txt
Grep [tips]
Grep recursivo: # grep -r -l ^root /etc 2>/dev/null/etc/passwd ...Mostra as 4 linhasanteriores(before): grep -B4 Ma nomes.txtposteriores(after): grep -A4 Ma nomes.txtentre: grep -4 Ma nomes.txt
Grep [trick]
Sempre é um transtorno ficar testando strings de pesquisa com o grep, por que precisamos mover o cursor pro meio, certo?! Pense novamente!
# < nomes.txt grep maria # < nomes.txt grep jose
Monitorando
# for i in 1 2 3; do uptime;sleep 1;done# for ((i=0;i<99;i++));do uptime;sleep 1;done# while true; do uptime;sleep 1;done# while [ 1 ]; do uptime;sleep 1;done# while :; do uptime;sleep 1;done
Monitorando [tips]
O comando Watch é um dos mais esquecidos. É ideal para monitorar:
# watch uptime
# watch -n 3 uptime
# watch -d -n 3 uptime [trick]
find [tips]
Para pesquisar recursivamente não existe nada melhor que o find
# find . -name '*.txt' -atime +5 # find . -name '*.txt' -atime -5 # find . -name '*.txt' -atime 5 # find /home/user -mtime -5 -type f|
xargs grep -i sexo
find [tricks]
Resolvendo o problema dos arquivos com espaço:
# find /home/user -mtime -5 -type f -name '*.txt' -print0|xargs -0 grep -i sexo
SED = REGEXP
Pra usar o sed, alias, para ser um verdadeiro profissional em TI um mínimo de conhecimento em REGEXP é essencial!
O básico já é muito, lembre-se KISS! ^ = inicio da linha . = qualquer caracter $ = final da linha [0-9] = qqer número [^char] = qualquer caracter exceto estes
Continuando...
+ => Repetição de 1 ou + vezes o caracter anterior
. => Repetição de 0 ou + vezes o caracter anterior
Ex:# sed 's/^ubuntu://' /etc/passwd# sed 's/^ubuntu:\(.*\)$/test:\1/' /etc/passwd
Sed [tips]
SED aceita qualquer tipo de separador, ex:
separador 'a' echo 12345678 | sed 'sa123a666a' separador '|' boa escolha echo /tmp/passwd | sed 's|/tmp/|/etc|'
Sed [trick]
Ao trabalhar com sed, podemos ficar frustrados por ele não alterar o arquivo, sempre jogar a saída para stdout. ERRADO! Usar opção -i (muito cuidado)
Não deixar ninguem fumando perto quando usar este parâmetro!
sed -i 's/Maria/& Sapatao/gi' nomes.txt
Shell script [tips]Portabilidade
#!/usr/bin/env bashSe o bash estiver definido no path(default
para qualquer shell), env o encontrará.“env” deixa o script mais portável
Aspas e apóstrofos
# echo “$PWD”# echo '$PWD'# echo $PWD# echo ${PWD}# echo “$PWD”a# echo '$PWD'a# echo $PWDa# echo ${PWD}a
Shell [tips]Alterando variáveis no shell:server=”riold45-10.5.9.8”
nome=$(echo $server|cut -d '-' -f 1)ip=$(echo $server|cut -d '-' -f 2)
nome=$(echo $server|sed 's/-.*$//')ip=$(echo $server|sed 's/^.*-//')
Shell [tricks]Alterando variáveis no shell de forma
otimizada, esta vale a pena gravar!
server=”riold45-10.5.9.8”nome=${server/-*/}ip=${server/*-/}
Shell functions [tips]Reutilize codigo, usando functions em shell# soma() { echo $(( $1 + $2 )); } # uma linha# soma 4 2# 6#Somar Identado, parametros $1 e $2function somar() { echo $(($1 + $2))}
Shell arrays [tips]Shell bash suporta arrays, apenas
unidimensionais e com índice numéricos:
a[0]=1a[1]=aa[2]=4echo ${a[0]} ${a[1]} ${a[2]}
std(in|out|err)Stdin (/dev/stdin): entrada padrão# tail /var/log/messages|vi -Stdout (/dev/stdout): saida padrão “1>”# ls >/dev/null (não tem erro, não printa nada)# ls arquivo_asdsd.fff > /dev/null (printa erro)Stderr (/dev/stderr): saida erro “2>”# cmd.exe > /dev/null (printa erro)# cmd.exe 2> /dev/null (não printa erro)
std(in|out|err) [tips]Jogar toda a saída para como se fosse saida
padrão, para manipular com grep# cmd 2>&1 (saida de erro se soma a stdout)
#Jogar tudo para /dev/nullif grep root /etc/passwd > /dev/null 2>&1then echo root user existfi
[tricks]Bash 3: mandar tudo para um mesmo output:cmd &>/dev/null == cmd > /dev/null 2>&1Executar segundo comando se primeiro ok# ls -d /tmp && cd /tmpExecutar segundo comando se primeiro falha# ls -d /tmp/a || mkdir /tmp/a && cd /tmp/aDebugando script shellbash -x script.sh
Expansão {}
# echo 1{2,3}# mkdir a{1,2,3,4,5,6,7,8,9} == a{1..9}# echo {a..z}{A..Z} != echo {a..z} {A..Z}# ls -d /etc/[a-z][a-z][0-9]*# ls -d /etc/[a-z][a-z][!0-9]*# ls -d /etc/[a-z][a-z][^0-9]*# touch works; mv work{s,}
Vim <inicialização>Dentro do vim:help vimtutor
CLI# vimtutor
Referências:
Man bash