como extrair nomes de serviços do arquivo e salvá-los na versão limpa no arquivo? [fechadas]

0

Eu tento descobrir como extrair todos os nomes de serviços de / etc / services e enviá-los para o arquivo de texto classificá-los em ordem alfabética remover quaisquer duplicados livrar-se de quaisquer linhas em branco e espaços desnecessários e ter contagem de linhas

    
por Soulrelic 10.03.2018 / 20:30

3 respostas

1

O arquivo /etc/services se parece com isto:

# Network services, Internet style
#
# (more comments)

tcpmux    1/tcp     # TCP port service multiplexer
echo      7/tcp
...
discard   9/tcp     sink null
discard   9/udp     sink null
...
ssh       22/tcp    # SSH Remote Login Protocol
...

Ou seja, existem

  • linhas que consistem apenas em um comentário
  • linhas com comentários finais
  • linhas vazias
  • duplicados na primeira coluna

Para remover todos eles, o seguinte comando é um possível:

awk '!/^\s*$/ && !/^\s*#/ {print $1}' /etc/services | sort -u | cat -n

Saída

 1  acr-nema
 2  afbackup
 3  afmbackup
 4  afpovertcp
 5  afs3-bos
 6  afs3-callback
 7  afs3-errors
...

Explicação

awk '!/^\s*$/ && !/^\s*#/ {print $1}' /etc/services

Em geral, awk lê um determinado arquivo (ou stdin) e, em seguida, executa o seguinte para cada linha:

condition_for_a_line { commands_when_condition_is_met }    

Usamos !/^\s*$/ && !/^\s*#/ como a condição que significa que a linha não está vazia e a linha não inicia com um comentário . Quando ambas as condições são atendidas, a primeira coluna $1 é impressa. Isso nos dá todas as primeiras colunas do arquivo sem linhas vazias e de comentário.

sort -u

Isso classifica os dados e elimina duplicatas de uma só vez.

cat -n

Simplesmente adiciona números de linha.

    
por PerlDuck 11.03.2018 / 12:18
1

Aqui está minha sed solution:

</etc/services sed '/^\w/!d;s/\s.*//' | sort -u >out

sed '…' file em vez de <file sed '…' é possível, mas não é preferível, como Stéphane Chazelas explica .

Isso primeiro eliminará todas as linhas que começam com algo diferente de um caractere de palavra, depois excluirá todas as linhas começando com o primeiro caractere de espaço em branco, classificará alfabeticamente e eliminará linhas duplicadas e finalmente redirecionará a saída para o arquivo out .

Para obter uma contagem de linha desse arquivo, usei wc :

<out wc -l

Explicações

  • </etc/services - deixa bash abrir o arquivo especificado e atribui seu conteúdo a stdin, não importa se esse redirecionamento é colocado antes ou depois do comando, você pode até fazer >out sed '…' <in se gostar
  • sed '…' - deixa sed executar as expressões
  • /^\w/!d - não ( ! ) d elete todas as linhas que começam ( ^ ) com um caractere w ord, mas todas as linhas que não correspondem a esse critério
  • s/\s.*// - em cada linha, s ubstitua a primeira correspondência de um caractere s pace branco e tudo ( .* ) que segue sem nada (= delete it)
  • command1 | command2 - deixa bash atribuir o stdout de command1 ao stdin command2
  • sort -u - let sort classifica as linhas alfabeticamente e gera apenas o primeiro de uma execução igual ( -u ou --unique )
  • >out - deixa bash redirecionar o stdout para o arquivo especificado
  • wc -l - deixa wc imprimir as novas contagens l ine
por dessert 11.03.2018 / 13:50
-1
awk '{print $1}' /etc/services | grep -v # | uniq | sort > yourFile
    
por Josef Klimuk 11.03.2018 / 07:19