Como filtrar várias strings

2

Para as linhas a seguir, preciso filtrar apenas o protocolo, a porta e o serviço.

tcp 127.0.0.1:25  1147/master
tcp 0.0.0.0:443  1039/nginx:
tcp 127.0.0.1:8001  1218/python
tcp 0.0.0.0:10050  939/zabbix_agentd
tcp 127.0.0.1:6379  891/redis-server
tcp 0.0.0.0:80  1039/nginx:
tcp 0.0.0.0:22  889/sshd
tcp 127.0.0.1:5432  929/postmaster
udp 127.0.0.1:323 645/chronyd

Eu preciso disso assim:

tcp 25 master
tcp 443 nginx
tcp 8001 python
tcp 10050 zabbix_agentd
tcp 6379 redis-server
tcp 80 nginx
tcp 22 sshd
tcp 5432 postmaster
udp 323 chronyd
    
por David 05.10.2018 / 21:15

4 respostas

3

Aqui está uma maneira de fazer isso:

sed -re 's/[^ ]+://' -e 's# +[0-9]+/# #' -e 's/:$//'

Explicação:

  • sed -r - use sed no modo de extensão estendida
  • -e 's/[^ ]+://' - remove tudo antes dos primeiros dois pontos para trás até um espaço
  • -e 's# +[0-9]+/# #' - substitui qualquer número de espaços, um número e uma barra com um único espaço
  • -e 's/:$//' - remove dois pontos do final da linha
por 05.10.2018 / 21:24
5

Isso parece mais simples e fácil de lembrar. A opção -F para o AWK permite que você forneça uma classe de expressão regular que inclua os caracteres que você precisa dividir.

awk -F'[ :/]' '{print $1,$3,$5}' file

steve (abaixo) mencionou um caminho mais curto do que eu pensava originalmente:

  • Em vez de cat file | ... , basta colocar o arquivo no final.
  • Vírgulas entre itens do dólar adicionam espaços.
por 05.10.2018 / 21:33
2
cat file | sed 's/[:/]/\t/g' | awk '{print $1 " " $3 " " $5}'
tcp 25 master
tcp 443 nginx
tcp 8001 python
tcp 10050 zabbix_agentd
tcp 6379 redis-server
tcp 80 nginx
tcp 22 sshd
tcp 5432 postmaster
udp 323 chr

sed 's/[:/]/\t/g' convert ':' and '/' to tab
    
por 05.10.2018 / 21:26
2

Com um único awk :

$ awk '{ print $1, gensub( /^.*:/, "", "1", $2 ), gensub( /[0-9]+\//, "", "1", $3 ) }' input
tcp 25 master
tcp 443 nginx:
tcp 8001 python
tcp 10050 zabbix_agentd
tcp 6379 redis-server
tcp 80 nginx:
tcp 22 sshd
tcp 5432 postmaster
udp 323 chronyd
    
por 05.10.2018 / 21:40