Solução rápida dos Exercícios de Unix !

 

 

Re-Direcção do I/O

 

  1. stdin e stdout ! Experimente a seguinte sequência de comandos (em negrito) no seu terminal e explique o que está a acontecer em cada passo.
  2. (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 !)

     

     

  3. Explique a diferença entre: who | sort e who > sort
  4.  

    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

     

  5. O que acontece com o comando wc mal escrito assim: ciunix> wcll > temp
  6. 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

     

  7. Explique o conteúdo do ficheiro criado por o comando: ciunix> ls >ls.out
  8.  

    Resolução :

    O ficheiro ls.out contem uma listagem dos ficheiros do directório actual.

     

  9. Explique o output do: ciunix> wc temp > temp
  10.  

    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>

     

  11. Crie os seguintes ficheiros, com por exemplo o comando touch

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

 

  1. Leia a página do ajuda on-line sobre o comando ls. (man ls)
  2.  

    Man ls

    Repare ls -a -t -l -f -d

     

  3. Quais são as opções do comando cat. (man cat).
  4. 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

     

  5. Faça uma listagem de todos os ficheiros no seu directório actual ( ls -a ).
  6. 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 !!!

     

  7. Quais são as permissões do ficheiro do directório "." (ls -ld .) ??. Consegue-se fazer um comando do género who > . ou who > ..??
  8.  

    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

     

  9. Crie um link simbólico e um link hard ao ficheiro cap1.txt no mesmo directório deste. A seguir faça uma listagem dos ficheiros : ls -l e ls -i. Explique o output em relação aos i-nodes e links.

 

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

 

  1. Juntando os comandos who e wc com um pipe crie um linha do comando que escreverá o número actual de pessoas "logged on"
    1. Escreva esta linha num ficheiros chamado nu e a seguir "execute" este ficheiro (se não execute verifique as permissões do ficheiro !).
    2. Verifique que o seu caminho (path) inclua o seu directório bin ~aluno/bin. Fazer isto examinando a variável do ambiente PATH com o comando echo $PATH.
    3. Mude o ficheiro nu para o seu directório bin. Ainda consegue executar este ficheiro ? Porquê ?

     

    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 C­shell 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)

     

  2. Para criar o ficheiro nu podia ter escrito echo "who | wc -l" > nu.
  3. (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 !!

     

  4. Partindo do seu directório raiz e usando os comandos ls -lR (opção R=>Recursividade) e grep faça uma listagem de todos os seus ficheiros que são executáveis (quer dizer o seu file mode contêm um x !).
  5.  

    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 !

     

  6. Partindo do seu directório raiz e usando o comando ls e grep faça uma listagem dos seus ficheiros cujos nomes não contêm qualquer número (só letras)
  7.  

    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.

     

  8. Utilize os comandos finger, grep e sort para obter uma listagem ordenada dos utilizadores ligados à máquina sem a primeira linha do output do finger.
  9.  

    finger | grep -v Login | sort

    finger -f | sort

     

  10. Escreva algum texto dentro dos ficheiro cap1.txt etc.
    1. Usando o comando sed substitua as palavras ' o ' com ' A ' nos ficheiros
    2. Tente fazer a mesma coisa com o comando tr
    3. Escreva os comandos (da parte 6.1) usados num ficheiro executável .

     

    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

     

  11. Neste exercício vai experimentar utilizar o comando awk usando como input o output dos comandos ps, who e finger.
    1. Escolha alguns campos destes comandos para escrever como output
    2. Um dos campos do comando ps -auxw é o % tempo cpu. Usando awk escreva o processo que está a utilizar o valor máximo.
    3. Invente os seus próprios exemplos ...!

 

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 !

  1. Faça um link simbólico do ficheiro cicloslink
  2. ao ficheiro ~crocker/prog3/ciclos.

    link -s ~crocker/prog3/ciclos cicloslink

     

  3. Examine o conteúdo, explique o que faz.
  4. 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ã.

     

  5. Executa o programa com : cicloslink 1 depois para o programa com ctrl-c e faz ps. Agora volte executar cicloslink 1 mas este vez faz ctrl-z e a seguir faça ps, qual a diferença ?
  6.  

    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)

     

  7. Se cicloslink ainda está a correr, dê o comando fg, o que acontece ?
  8. fg => forground. Volte a correr o processo

     

  9. Para o programa cicloslink 1 com ctrl-z e dê o comando cicloslink 2 seguido por ctrl-z e cicloslink 3 seguido por ctrl-z
  10. Examine o output do ps -lw e explique os campos PID e PPID
  11.  

    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

     

  12. Examine o output do comando jobs.
  13. 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

     

  14. Experimente com o comando fg %1 ou fg%2 etc. O que está a acontecer ?
  15. fg %1 : puts the job number % back running

     

  16. O comando bg põe a correr um processo parado em "background". Experimente com um dos seus processos parados. Tente parar o processo - sem usando kill -9
  17. a solução é por o processo a correr em fg e depois usar ctrl-z!!

     

  18. Qual é o PID do seu "login shell", ? qual é o programa e dono do pai deste processo ?

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

 

  1. Localize, a partir do seu directório raiz,
    1. Os ficheiros que tem com mais de 10 blocos ?
    2. Os ficheiros que tem com menos de 10 blocos ?
    3. Os ficheiros cujos nome contêm "cap"
    4. Os ficheiros cujas extensões são .txt
  2. Crie, utilizando o comando touch, em vários dos seus subdirectórios um ficheiro chamado core.
    1. Localize, a partir do seu directório raiz, estes ficheiros
    2. Apague estes ficheiros utilizando find e exec.
  3. Localize os seus ficheiros com
    1. tempo de modificação inferior a um dia
    2. tempo de acesso inferior a um dia.
  4. Invente mais três exercícios sobre o comando find e find com exec. Um deve ser acerca da opção/flag -perm.