Como analisar o arquivo csv com bash

Tenho um arquivo CSV com endereços IP e portas abertas:

IP,1,3,4,6,7,9,13,17,19,20,21,22,23,24,25,26 1.1.1.2,,,,,,,,,,,open,,,,, 1.1.1.3,,,,,,,,,,,open,,,,, 1.1.1.4,,open ,open,,,,,,,,open,,,,, 1.1.1.5,,,,,,,,,,,open,,,,, 1.2.3.4,,,,,,,,,,,open,,,,, 1.4.5.6,,,,,open,,,,,,open,,,,, 1.4.5.6,,,,,,,,,,,open,,,,, 1.1.3.4,,,,,,,,,,,open,,,,, 

Para cada endereço IP com uma porta aberta, preciso executar um comando usando o endereço IP e o número da porta aberta (obtido do cabeçalho CSV).

Comentários

  • O comando que você executa para cada IP com portas abertas terá que usar o número de porta correspondente? O número da porta é o número listado no cabeçalho CSV?
  • @Kusalananda exatamente !!
  • e obrigado por me ajudar a editar minha pergunta @Kusalananda e você entendeu minha pergunta,
  • Eu ' passarei esta questão em particular, obrigado; mas se eu fosse responder, gostaria de saber qual comando você ' está executando, para que ' fique claro como a porta deve ser retratado. Acho que ' tornaria a resposta mais útil para você. Eu ' d também gostaria de saber se o número de portas possíveis termina em 26 ou pode chegar a 65.535? Além disso, haveria apenas uma porta aberta? Poderia haver zero ou mais de um?
  • O comando @JeffSchaller é telnet e o número da porta não é até 65.535, mas tenho mais de 900 portas e o status muda a cada vez com a varredura. o que eu quero alcançar é verificar se há alguma sessão telnet ativa escutando, mas eu só preciso de ajuda para escolher o IP e o número da porta que está aberta

Resposta

Resolver isso competentemente em puro bash não seria, eu acho, aconselhável. Veja, por exemplo a questão “ Por que usar um loop de shell para processar texto é considerado uma prática inadequada? “.

Em vez disso, vamos criar os dados de entrada um pouco mais fácil de digerir.

awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv 

Este awk comando leria primeiro os números das portas na primeira linha do o arquivo CSV em uma matriz chamada port. O número da porta para a coluna N seria armazenado em port[N].

Ele faz isso dividindo a primeira linha da entrada em vírgulas e simplesmente armazenando o resultado na matriz port. Isso é o que split() o comando sim. A condição FNR == 1 significa “Se esta for a primeira linha do arquivo, faça isso …” (FNR é o número da linha no arquivo de entrada atual). Um bloco de código sem condição será executado para cada linha de entrada.

Depois de chamar split(), , o separador de campo, é definido como uma vírgula. Isso significa que as outras linhas do arquivo serão divididas automaticamente por vírgulas em campos. Isso é usado no loop no segundo bloco para percorrer os campos CSV (do segundo campo ao último) em cada linha.

Para cada uma das outras linhas nos dados, ele percorre os campos delimitados por vírgulas e quando encontra um campo cujo valor é a string open, ele imprime o endereço IP (o primeiro campo) e o número da porta correspondente.

A saída desse comando, dados os dados em questão, é

1.1.1.2 21 1.1.1.3 21 1.1.1.4 4 1.1.1.4 21 1.1.1.5 21 1.2.3.4 21 1.4.5.6 7 1.4.5.6 21 1.4.5.6 21 1.1.3.4 21 

Isso pode ser facilmente lido por um loop no shell:

while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done 

Isso lê o endereço IP e o número da porta, um por um.

Para combiná-los em um script completo:

#!/bin/sh awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv | while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done 

A saída do awk o comando é canalizado para o loop while que lê os valores e chama o comando (observe o | canal após o nome do arquivo de entrada).

Observe que se um endereço IP tiver mais de uma porta aberta, o comando será executado várias vezes para esse endereço.

Comentários

  • OMG isso era o que eu estava tr ying fazer, isso é incrível. Eu sou burro Você pode me ajudar a entender melhor isso (você pode me dizer no modo de depuração?)
  • @biniyamgetu Eu preciso saber exatamente o que eu preciso explicar.
  • Mano I estou muito grato, isso é tão útil … então, o que FNR == 1 está fazendo, então vejo divisão e o que é FS
  • @biniyamgetu Espere, vou adicionar algum texto extra sobre essas coisas .
  • você é um gênio e está fazendo o que eu queria fazer … Obrigado, senhor !!

Resposta

Selecione o primeiro e o próximo campos respectivos usando awk.

awk -d "," -F "{print $1, $n...} 

Comentários

  • Isso não ' ainda não aborda a execução de um comando ou o uso das portas. No futuro, quando as perguntas estiverem passando por muitos comentários e edições, eu ' d sugiro esperar que os requisitos sejam estabelecidos antes de tentar uma resposta.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *