Como eu escrevo um script Bash para este cenário?

2

Eu tenho esses arquivos no diretório home/acs .

TBBN027162G_38d8-2f08-0c40
TBBN027605G_38d8-2f08-1518
TBBN027941G_38d8-2f08-0d1c
TBBN027923G_38d8-2f08-35e4

Eu quero ler TBBN027162G como service_id e 38d8-2f08-0c40 como mac_address e, em seguida, armazená-lo no meu banco de dados. Eu também quero fazer o backup do arquivo para referência futura.

Abaixo está o script que tentei escrever, ainda incompleto. Eu não tenho ideia de como fazer isso funcionar.

#!/bin/bash

cd /home/acs/

FILES=*

for f in $FILES
do
    #backup file
    echo "$f" >> /home/suriani/acs/data/mac/maclist

    while read $line
    do
      awk -F '_' '{print }' /home/suriani/acs/data/mac/maclist
      #read service_id

      awk -F '_' '{print }' /home/suriani/acs/data/mac/maclist
      #read mac_address

    done < /home/suriani/acs/data/mac/maclist

done

A saída:

TBBN027162G
38d8-2f08-0c40
TBBN027162G
TBBN027605G
38d8-2f08-0c40
38d8-2f08-1518
TBBN027162G
TBBN027605G
38d8-2f08-0c40
38d8-2f08-1518
TBBN027162G
TBBN027605G
TBBN027923G
38d8-2f08-0c40
38d8-2f08-1518
38d8-2f08-35e4
TBBN027162G
TBBN027605G
TBBN027923G
38d8-2f08-0c40
38d8-2f08-1518
38d8-2f08-35e4
TBBN027162G
TBBN027605G
TBBN027923G
38d8-2f08-0c40
38d8-2f08-1518
38d8-2f08-35e4
TBBN027162G
TBBN027605G
TBBN027923G
TBBN027941G
38d8-2f08-0c40
38d8-2f08-1518
38d8-2f08-35e4
38d8-2f08-0d1c
TBBN027162G
TBBN027605G
TBBN027923G
TBBN027941G
38d8-2f08-0c40
38d8-2f08-1518
38d8-2f08-35e4
38d8-2f08-0d1c
TBBN027162G
TBBN027605G
TBBN027923G
TBBN027941G
38d8-2f08-0c40
38d8-2f08-1518
38d8-2f08-35e4
38d8-2f08-0d1c
TBBN027162G
TBBN027605G
TBBN027923G
TBBN027941G
38d8-2f08-0c40
38d8-2f08-1518
38d8-2f08-35e4
38d8-2f08-0d1c
    
por enthusiastic engineer 29.06.2015 / 09:16

2 respostas

0

Em python

Em um forro de um (longo):

python3 -c 'data = [l.split("_") for l in open("f").read().splitlines()]; [print("service_id: "+d[0]+",", "mac_address: "+d[1]) for d in data]'

em que 'f' é o arquivo de origem, entre aspas (duplas).

Saída:

service_id: TBBN027162G mac_adrres: 38d8-2f08-0c40
service_id: TBBN027605G mac_adrres: 38d8-2f08-1518
service_id: TBBN027941G mac_adrres: 38d8-2f08-0d1c
service_id: TBBN027923G mac_adrres: 38d8-2f08-35e4

Escrito em um scriptfile:

#!/usr/bin/env python3
import sys

f = sys.argv[1]

data = [l.split("_") for l in open(f).read().splitlines()]
for d in data:
    print("service_id: "+d[0]+",", "mac_address: "+d[1])
  • Se você preferir a versão do script, copie-a em um arquivo vazio, salve-a como extract_data.py , execute-a com o arquivo como um argumento:
    python3 /path/to/extract_data.py /path/to/sourcefile

Em detalhes, "zoom out":

open(f).read().splitlines()

lê o arquivo, divide-o em linhas

[l.split("_") for l in open(f).read().splitlines()]

cria uma lista dessas linhas, dividida em duas seções pelo delimitador _

for d in data:
    print("service_id: "+d[0]+",", "mac_address: "+d[1])

finalmente combina as duas seções por linha com as strings:

service_id: 

e

mac_address: 

EDITAR

Lendo vários arquivos (todos) em um diretório de uma só vez, precisamos de mais duas linhas no script:

#!/usr/bin/env python3
import sys
import os

dr = sys.argv[1]
# list the directory's files, exclude hidden and backup files:
flist = [dr+"/"+f for f in os.listdir(dr) if not any([f.startswith("."), f.endswith("~")])]
# split the lines into sections:
data = sum([[l.split("_") for l in open(f).read().splitlines()] for f in flist], [])
# generate the print command per (split) line, combine it with the naming strings:
[print("service_id: "+d[0]+",", "mac_adrres: "+d[1]) for d in data]

Embora o script ignore arquivos e arquivos ocultos, terminando com ~ , ele supõe que o diretório contém apenas arquivos legíveis e válidos.

Use-o exatamente como o primeiro script, mas agora apenas com o diretório como argumento:

python3 /path/to/extract_data.py /path/to/source_directory

Exemplo de saída:

service_id: TBBN027162A, mac_adrres: 38d8-2f08-0c21
service_id: TBBN027605A, mac_adrres: 38d8-2f08-1534
service_id: TBBN027941A, mac_adrres: 38d8-2f08-0d8v
service_id: TBBN027923A, mac_adrres: 38d8-2f08-35e4
service_id: TBBN027162G, mac_adrres: 38d8-2f08-0c40
service_id: TBBN027605G, mac_adrres: 38d8-2f08-1518
service_id: TBBN027941G, mac_adrres: 38d8-2f08-0d1c
service_id: TBBN027923G, mac_adrres: 38d8-2f08-35e4
    
por Jacob Vlijm 29.06.2015 / 09:32
0

Usando awk para criar uma consulta SQL:

find . -type f -maxdepth 1 -exec awk -F_ '{print "INSERT INTO table (service_id, mac_adress) VALUES (\"""\",\"""\");"}' {} \;

Exemplo de saída:

INSERT INTO table (service_id, mac_adress) VALUES ("TBBN027162G", "38d8-2f08-0c40");
INSERT INTO table (service_id, mac_adress) VALUES ("TBBN027605G", "38d8-2f08-1518");
INSERT INTO table (service_id, mac_adress) VALUES ("TBBN027941G", "38d8-2f08-0d1c");
INSERT INTO table (service_id, mac_adress) VALUES ("TBBN027923G", "38d8-2f08-35e4");

Ou uma versão mais completa:

#!/bin/bash

find /home/suriani/acs/data/mac/maclist -maxdepth 1 -type f ! -name "*.bak" -print0 | while IFS= read -r -d '' file; do

    # create the queries
    queries=$(awk -F_ 'print "INSERT INTO table (service_id, mac_adress) VALUES (\"""\",\"""\");"' "$file");

    # fire the queries, echo is a sample output
    echo "$queries"

    # if database update is ok, move the file
    # mv "$file" "/home/suriani/acs/data/mac/maclist/$file.bak"
done
    
por A.B. 29.06.2015 / 10:49