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
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?
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
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.