Solução rápida dos Exercícios de Unix !
Re-Direcção do I/O
(O comando ctrl-d quer dizer fim do input ou eof=end of ficheiro)
ciunix> cat
algumas palavras
ctrl-d
ciunix> cat > gato
Miau, brrrr
ctrl-d
ciunix> cat gato
ciunix> cat >> gato
miau
ctrl-d
ciunix> cat gato
ciunix> cat < gato
Resolução :
Para notar que o comando cat sem opções segue o padrão UNIX, quer dizer :
ler no stdin, até receber o EOF, e escrever no stdout.
O output e input pode ser modificado usando re-dirrecção > >> e < como ilustrado neste exemplo :
ciunix>cat > gato vai criar o ficheiro gato e mande o output do comando cat para este ficheiro.
ciunix>cat ficheiro. O próprio código do comando cat abre o ficheiro e escreve o seu conteúdo no stdou
ciunix>cat gato : abre o ficheiro gato e mande o seu conteudp para o stdout (ecrã)
ciunix>cat >> gato acrescente o ficheiro gato
ciunix>cat < gato : o shell re-dirreccione o stdin para o conteúdo do ficheiro gato, a seguir o comando cat mande o seu output para stdout ( mesmo efeito como >cat gato a diferença é quem faz o trabalho : o shell ou o comando !)
Resolução :
who | sort . Juntando os comandos who e sort utilizando um pipe quer dizer o ouput do comando who é o input do comando sort.
who > sort . Este comando tem um re-direcção => um ficheiro chamado sort é criado pelo c-shell e depois o comando who é executado o output do comando é mandado para o ficheiro sort
Verifique fazendo, ls -l, e depois more sort
Resolução :
O comando não é encontrado portanto haverá um mensagem do erro. O ficheiro temp será criado mas não usado => o seu tamanho será zero
ciunix.ubi.pt> wcll > temp
wcll: Command not found.
ciunix.ubi.pt> ls -l temp
-rw------- 1 crocker dmatinf 0 Mar 1 14:05 temp
Resolução :
O ficheiro ls.out contem uma listagem dos ficheiros do directório actual.
Resolução :
O ficheiro temp é criado primeiro, apagará o que lá estava, portanto o output do comando wc temp será sempre zero caraceteres etc
ciunix.ubi.pt> wc temp > temp
ciunix.ubi.pt> cat temp
0 0 0 temp
ciunix.ubi.pt>
cap1.txt cap2.txt cap3.txt cap4.txt cap?.txt
a) faça uma listagem ( ls -l ) dos ficheiros que começam com cap
b) faça uma listagem ( ls -l ) dos ficheiros cap1,2 e 3 (use o modelo [])
b) faça uma listagem ( ls -l ) de apenas o ficheiro cap?.txt
c) apagar o ficheiro cap?.txt
Resolução :
ciunix.ubi.pt> touch cap1.txt cap2.txt cap3.txt cap?.txt
No match.
ciunix>
como ainda não existem ficheiro cap? => erro !!
ciunix.ubi.pt> touch cap1.txt cap2.txt cap3.txt
ciunix.ubi.pt> touch cap?.txt
ciunix.ubi.pt> ls
cap1.txt cap2.txt cap3.txt
cap?.txt ainda não foi criado
ciunix.ubi.pt> touch "cap?.txt"
ou touch cap\?.txt
ciunix.ubi.pt> ls
cap1.txt cap2.txt cap3.txt cap?.txt
ciunix.ubi.pt>
a) ls cap*
b)
ciunix.ubi.pt> ls cap*.txt
cap1.txt cap1.txt cap2.txt cap2.txt cap3.txt cap3.txt cap?.txt
CHAOS devido a o cap?.txt
c) ls cap[1-9].txt
d) ls -l cap\?.txt
e) rm "cap?.txt"
Ficheiros
Man ls
Repare ls -a -t -l -f -d
Escreva uma frase no ficheiro cap1.txt, inclui vários "tabs" e "newlines" no seu ficheiro. Depois dê os seguintes comandos e explique o que acontece.
cat cap1.txt
cat -t cap1.txt
od cap1.txt
od -c cap1.txt
od -cb cap1.txt
(od = octal dump : veja: man od para mais info.)
resolução:
cat -t => tabs aparecem com Î
od => octal dump do ficheiro
od -c => mostra linha a linha \t e \n indicados
od -cb => como od -c mas inclui linha extra para mostrar codigo ASCII
dos caracteres
A seguir, examine o ficheiro do directório (o ponto ) com o comando
od -cb ·
Explique o output deste comando.
Resolução:
ls -a => para mostrar ficheiros no directório
od -c . => para mostrar o formato do FICHEIRO "." do directório !!!
Resolução:
ciunix.ubi.pt> ls -ld .
drwx------ 2 crocker dmatinf 8192 Mar 1 14:10 .
ciunix.ubi.pt>
o directório pertence a mim e tenho permissões para o ler, executar e escrever !
MAS
ciunix.ubi.pt> who >> .
.: Is a directory
ciunix.ubi.pt>
o sistema operativo não nos deixa escrever este ficheiro directamente !!
Exemplo : ciunix.ubi.pt > touch nova-ficheiro
ciunix.ubi.pt > ls -ld .
drwx------ 2 crocker dmatinf 8192 Mar 1 14:15 .
Nota: o tempo do ficheiro foi alterado ! Criamos um ficheiro, portanto o ficheiro "." foi actualizado pelo sistema
Resolução
ciunix.ubi.pt> ln cap1.txt linkcap1
ciunix.ubi.pt> ls -li
total 2
24499 -rw------- 2 crocker dmatinf 34 Mar 1 14:16 cap1.txt
23810 -rw------- 1 crocker dmatinf 0 Mar 1 14:10 cap2.txt
23809 -rw------- 1 crocker dmatinf 0 Mar 1 14:10 cap3.txt
24461 -rw------- 1 crocker dmatinf 0 Mar 1 14:10 cap?.txt
24499 -rw------- 2 crocker dmatinf 34 Mar 1 14:16 linkcap1
ciunix.ubi.pt>
Reppare no campo numero de links - os ficheiros linked tem "2" links e o mesmo numero de I-node 2499
Pipes e os Filtros Grep, Sed e Awk
CONTEÙDO do FICHEIRO: echo "numero de pessoas logged on" ; who | wc -l
>chmod +x nu
>env OU echo $path para verificar que o seu bin faz parte do seu path
>mv nu ~/bin
>nu
comand not found !
não funcione !! (>cd ~/bin ; >nu - funcionará se o "." está no seu path)
Porquê:
A Cshell mantem uma tabela de hash com todos os nomes dos comandos utilizáveis (para poupar tempo na procura). Esta tabela é inicializada
na entrada do sistema (login) e contêm os comandos executaveis nos directórios no nosso path, donde se acrescentarmos um comando aos comandos disponíveis esse comando não é encontrado for a do directório actual.
O comando rehash recalcula esta tabela de hash. (o mesmo efeito terá o comando source ~/.login com a desvantegm de também inicializar a nossa ambiente do trabalho)
(i)Verifique (ii) O que aconteceria se o comando for mal escrito sem as aspas ?
Resolução:
(ii) ficheiro nu é criado com o output dos comandos who | wc -l !!
ls -lR | grep '^…x..x..x' => ficheiro e directorios executaveis por todos
ls -lR | grep '^...x' => ficheiros e directorios executaveis por mim
Existem mais opçoes para verificar , melhor é o seguinte comando
ls -lR | grep '^[^UMESPAÇO]*x' => ficheiros e directorios executaveis !
UMESPAÇO quer dizer escreve aqui um espaço !
solução é de utilzar a opção -v do comando grep
soluçao: ls -R | grep -v '[1-9]'
Nota:
ls -R | grep '[a-zA-Z]' => ISTO NÂO, isto apanhava todos os ficheiros cujo nomes contêm pelo menos um caracter, mas vai também apanhar ficheiros cujos nomes são uma mistura de caracteres e numéros.
finger | grep -v Login | sort
finger -f | sort
Resolução
sed 's/o/A/g' cap1.txt
cat cap1.txt | tr o A
para substiuuir no ficheiro TEM que usar um ficheiro temporário
ex. utilize > temp e depois mv temp cap1.txt
Resolução
1) ps -af | awk ' { print $1,$2}'
Exemplos a brincar com wc -l * . does the sum twice for a laugh
wc -l * | awk ' { print $2, $1} END' :inverter campos
wc -l * | awk ' { s += $1 } END {print s }' : imprimir soma das somas
wc -l * | awk ' { s += $1 } {print $1, $2} END { print "soma=" s }'
Outra hipotese - meter os comandos num ficheiro "sum.awk" e depois
wc -l * | awk -f sum.awk
2)
ps -af | grep -v PID | awk ' BEGIN { s=0} { if ( $4 > s ) s=$4 ; linha=$0 } END { print "max=" s "\n" linha}'
Nota : uma linha interior é $0.
Os comandos são seperados por ;
if precisa dos parentesis : action : { if ( condição) comandos ; } just like c
Processos
1. Qual é a diferença entre ciunix> sleep 15; echo "hora do cha" e
ciunix> sleep 15 & ; echo "hora do cha" e
ciunix> (sleep 15; echo "hora do cha")&
a) pausa de 15 segundos seguido por echo da mensagem "hora de cha", o terminal está parado enquanto estes dois comandos não acabam
b) o processo de pausa de 15 segundos é executado logo em background e portanto a mensagem do echo aparecerá logo. O terminal estará livre antes do processo de sleep acabe !
c) os dois comandos são exewcutados em background. O terminal é disponivel logo , 15 segundos mais tarde aparecerá a mensagem sobre a cha !
2. Dê o comando sleep 120 &.
A seguir faça uma listagem dos seus processos (ps e ps -axw) e mate (kill ) o seu processo sleep 120
ciunix.ubi.pt> sleep 120 &
[1] 8799
ciunix.ubi.pt> ps
PID TTY S TIME CMD
4384 ttyp1 S 0:00.08 -csh (csh)
8799 ttyp1 S 0:00.00 sleep 120
ciunix.ubi.pt> kill 8799
ciunix.ubi.pt> ps
PID TTY S TIME CMD
4384 ttyp1 S 0:00.08 -csh (csh)
[1] + Terminated sleep 120
3. Segue as instruções !
ao ficheiro ~crocker/prog3/ciclos.
link -s ~crocker/prog3/ciclos cicloslink
Programa faz um ciclo, faz um listagem dos processos que contêm a palavra ciclo e depois conforme o argumento 1,2,3,x mande uma mensagem ao ecrã.
ciunix.ubi.pt> cicloslink 1
4434 ttyp2 S + 0:00.01 csh -f cicloslink 1
10245 ttyp2 R + 0:00.00 csh -f cicloslink 1
Um Bom Dia
ciunix.ubi.pt> ps
PID TTY S TIME CMD
8993 ttyp2 S 0:00.28 -csh (csh)
ciunix.ubi.pt>
ciunix.ubi.pt> cicloslink 1
9311 ttyp2 S + 0:00.01 csh -f cicloslink 1
10068 ttyp2 R + 0:00.00 csh -f cicloslink 1
Um Bom Dia
Stopped
ciunix.ubi.pt> ps
PID TTY S TIME CMD
8993 ttyp2 S 0:00.29 -csh (csh)
9311 ttyp2 T 0:00.01 csh -f cicloslink 1
10341 ttyp2 T 0:00.00 sleep 2
Process ainda existe mas está parado ( T => Stoppped Process)
fg => forground. Volte a correr o processo
ciunix.ubi.pt> ps -f
UID PID PPID C STIME TTY TIME CMD
crocker 458 28712 0.0 16:16:26 ttyp2 0:00.00 sleep 2
crocker 7032 8993 0.0 16:16:17 ttyp2 0:00.01 csh -f cicloslink 1
crocker 8993 9061 0.0 15:50:36 ttyp2 0:00.31 -csh (csh)
crocker 10337 10399 0.0 16:16:22 ttyp2 0:00.00 sleep 2
crocker 10368 7032 0.0 16:16:17 ttyp2 0:00.00 sleep 2
crocker 10399 8993 0.0 16:16:22 ttyp2 0:00.01 csh -f cicloslink 2
crocker 28712 8993 0.0 16:16:26 ttyp2 0:00.01 csh -f cicloslink 3
NOTAS: processes stoped during the comand sleep !
O PPID dos processos ciclolink 1,2 e 3 é o mesmo 8993 (o shell that launched these processes)
O PPID´s dos processos sleep é o PID do cicloslink1 ou 2 ou 3 conforme
ciunix.ubi.pt> jobs
[2] Stopped cicloslink 1
[3] - Stopped cicloslink 2
[4] + Stopped cicloslink 3
ciunix.ubi.pt>
Jobs gives a list of our current jobs and their status. Notice I had another job [1] which killed after stopping the three processes
fg %1 : puts the job number % back running
a solução é por o processo a correr em fg e depois usar ctrl-z!!
ciunix.ubi.pt> kill all processes and then ps -f
UID PID PPID C STIME TTY TIME CMD
crocker 8993 9061 0.0 15:50:36 ttyp2 0:00.32 -csh (csh)
ciunix.ubi.pt> ps -Af | grep 9061
root 9061 421 0.0 15:50:36 ?? 0:00.35 telnetd
crocker 8993 9061 0.0 15:50:36 ttyp2 0:00.33 -csh (csh)
crocker 10489 8993 0.0 16:25:19 ttyp2 0:00.00 grep 9061
The owner of my login shell is the TELNET DEMON - explain demon
O comando find