encontrar linhas muli no arquivo de outro arquivo

0

Eu tenho um arquivo de texto com várias linhas. Eu quero pesquisar por linhas contendo algum texto e adicionar # no início dessas linhas.

ex: file1 que eu quero mudar isso

acnet           6801/tcp                # ACNET Control System Protocol
acnet           6801/udp                # ACNET Control System Protocol
dlip            7201/tcp                # DLIP
dlip            7201/udp                # DLIP
ssp-client      7801/tcp                # Secure Server Protocol - client
ssp-client      7801/udp                # Secure Server Protocol - client

Eu quero encontrar portas localizadas no inputfile1. arquivo de entrada um contém:

6801
7801

, então a saída final do arquivo1 será assim:

#acnet           6801/tcp                # ACNET Control System Protocol
#acnet           6801/udp                # ACNET Control System Protocol
dlip            7201/tcp                # DLIP
dlip            7201/udp                # DLIP
#ssp-client      7801/tcp                # Secure Server Protocol - client
#ssp-client      7801/udp                # Secure Server Protocol - client

Eu tentei

cat /etc/services |grep -f ports.txt | awk  '{ print"#" $g}';

mas isso me dá a saída para a tela. Como mudá-los no arquivo?

    
por Khalid Abo El MaGd 09.04.2016 / 09:08

3 respostas

0

Tente algo como:

awk -F"[ \t]*|/" 'NR==FNR{A[$1]; next} $2 in A { printf "#" }1' ports.txt /etc/services > newfile

Se a saída estiver correta, você pode copiá-la para /etc/services

    
por 09.04.2016 / 09:59
0
sed '/6801\|7801/ {s/^/#/}' input
#acnet           6801/tcp                # ACNET Control System Protocol
#acnet           6801/udp                # ACNET Control System Protocol
dlip            7201/tcp                # DLIP
dlip            7201/udp                # DLIP
#ssp-client      7801/tcp                # Secure Server Protocol - client
#ssp-client      7801/udp                # Secure Server Protocol - client
    
por 09.04.2016 / 09:22
0
REGEXP=$(cat ports.txt | xargs | sed -e 's/ /|/g')
sed -E -i -e "/[[:space:]]$REGEXP\// s/^/#/" inputfile1

Isso constrói uma expressão regular estendida a partir do conteúdo de ports.txt e, em seguida, usa-os para selecionar determinados endereços (linhas) em inputfile1 para ter um caractere # pré-pendente.

O regex é "ancorado" com um espaço no início e um / no final, para que você não corresponda a mais do que o especificado - por exemplo, sem as âncoras, um 25 em ports.txt não corresponderia apenas à porta 25, corresponderia a QUALQUER porta contendo o número 25 em algum lugar, incluindo 2501 , 1025 , 250 e muito mais .

BTW, se você quiser ter comentários no ports.txt, use isto:

REGEXP=$(sed -e 's/#.*//' ports.txt | xargs | sed -e 's/ /|/g')
sed -E -i -e "/[[:space:]]$REGEXP\// s/^/#/" inputfile1

A primeira versão acima irá SOMENTE funcionar corretamente se ports.txt contiver nada além de números de portas, espaços e linhas vazias - qualquer caractere estranho (especialmente aqueles que tenham significado especial em regexps) causará imprevisibilidade e resultados quase certamente indesejáveis.

A segunda versão exclui comentários (ou seja, tudo após e incluindo qualquer caractere # em uma linha) e também permite (ignora) qualquer caractere em um comentário.

Ele também falhará se as portas listadas em ports.txt fizer com que o comando sed exceda o comprimento máximo da linha de comando. Como isso é tipicamente em torno de 128KB, é muito improvável que isso seja um problema neste caso, mas vale a pena notar no caso de você usar essa técnica para outras tarefas.

    
por 09.04.2016 / 09:58

Tags