2 votes

Comment écrire un script Bash pour ce scénario ?

J'ai ces fichiers dans le répertoire home/acs .

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

Je veux lire TBBN027162G como service_id y 38d8-2f08-0c40 como mac_address et ensuite le stocker dans ma base de données. Je veux également sauvegarder le fichier pour une référence future.

Voici le script que j'ai essayé d'écrire, encore incomplet. Je n'ai aucune idée de la façon dont cela peut fonctionner.

#!/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 $1}' /home/suriani/acs/data/mac/maclist
      #read service_id

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

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

done

Le résultat :

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

0voto

Jacob Vlijm Points 78990

En Python

En une (longue) ligne :

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]'

où 'f' est le fichier source, entre guillemets (doubles).

Sortie :

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

Rédigé dans un fichier de script :

#!/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])
  • Si vous préférez la version script, copiez-la dans un fichier vide, enregistrez-la sous le nom de extract_data.py et l'exécuter avec le fichier comme argument :

    python3 /path/to/extract_data.py /path/to/sourcefile

En détail, le "zoom arrière" :

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

lit le fichier, le divise en lignes

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

crée une liste de ces lignes, séparées en deux sections par le délimiteur _

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

combine enfin les deux sections par ligne avec les cordes :

service_id: 

et

mac_address: 

EDITAR

Pour lire plusieurs (tous) les fichiers d'un répertoire en même temps, nous avons besoin de deux lignes supplémentaires dans le 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]

Bien que le script saute les fichiers cachés et les fichiers, se terminant par ~ il suppose que le répertoire ne contient que des fichiers lisibles et valides.

Utilisez-le exactement comme le premier script, mais maintenant seulement avec l'option répertoire comme argument :

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

Exemple de sortie :

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

0voto

A.B. Points 84870

使用方法 awk pour créer une requête SQL :

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

Exemple de sortie :

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 une version plus complète :

#!/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 (\""$1"\",\""$2"\");"' "$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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X