Precisa de sed para remover pontuação

1

Eu tenho um arp-scan que eu corro de uma página PHP. Ele descobre dispositivos específicos na minha rede muito bem. A única coisa é que eu tenho que mudar a informação mac para remover os dois pontos e, em seguida, fazer todas as letras padrão para caps.

Aqui está o meu comando:

$output = shell_exec("sudo arp-scan --interface=eth0 --localnet --numeric --quiet| grep -e 80:82:87");

Recupera apenas os endereços MAC que começam com 80:82:87

Eu encontrei um comando sed para alterar todas as letras para caps, mas não neste comando. Como posso fazer isso?

    
por Ed Lentz 21.01.2017 / 01:11

4 respostas

1

Você pode fazer isso em sed da seguinte forma:

sed -n '/^80:82:87/ { s/;//g; y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/; p }'
  • A opção -n informa sed para não imprimir sua entrada exceto quando especificamente direcionado a fazê-lo.
  • O /^80:82:87/ diz que os comandos dentro das chaves {…} deve ser executado apenas nas linhas que começam com 80:82:87 . Isso fornece a mesma funcionalidade que o grep . Você nunca precisará canalizar grep para sed ou awk .
  • O comando s/;//g exclui todos os pontos-e-vírgulas na linha, que é o que você disse que quer. Se você quis dizer dois pontos, simplesmente mude para s/://g .
  • O comando y converte todas as letras minúsculas (romanas / ASCII) em maiúsculas. Se você só precisa converter endereços MAC (e / ou outros valores hexadecimais), você pode obter com y/abcdef/ABCDEF/ .
  • Finalmente, imprima a linha modificada.

@jasonwryan me empurrou para perceber que o complicado comando y pode ser substituído por s/[[:lower:]]/\U&/g , s/[[:alpha:]]/\U&/g , ou mesmo s/.*/\U&/ - mas somente se você estiver usando o GNU sed. \U não parece estar definido no POSIX.

    
por 21.01.2017 / 09:05
3

tr é ideal para operações simples como essa:

echo '80:82:87:af:d2' | tr '[:lower:]' '[:upper:]' | tr -d ':'
    
por 21.01.2017 / 01:24
2

Awk pode fazer a correspondência de padrões, maiúsculas e a substituição em uma passagem:

awk '/^80:82:87/ {gsub(/:/,""); print toupper($0)}'

    
por 21.01.2017 / 01:32
0

Eu estou ignorando o fato de que isso pode ser melhor feito em PHP (já que é com isso que você está trabalhando) usando as funções de manipulação de strings do PHP, possivelmente através de algo como $addr = strtoupper(str_replace(":", "", $output)) . Em vez disso, vou me concentrar em uma solução shell específica do Unix.

Usando o Awk:

awk 'BEGIN { RS=":"; ORS = "" } { print toupper }' <<<"$mac_address"

Teste:

$ mac_address="xx:yy:zz:k7:23:f0"
$ awk 'BEGIN { RS=":"; ORS = "" } { print toupper }' <<<"$mac_address"
XXYYZZK723F0

O programa Awk lerá cada parte do endereço MAC como um registro separado (normalmente, um registro é uma linha de entrada) e os imprimirá sem um separador de registro (o separador de registro de saída é, por padrão, uma nova linha) . Antes de imprimir cada registro, ele converte para maiúsculas.

    
por 21.01.2017 / 09:50