Как я пишу сценарий Bash для этого сценария?

У меня есть эти файлы в каталоге home/acs.

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

Я хочу читать TBBN027162G как service_id и 38d8-2f08-0c40 как mac_address и затем сохраните его в мою базу данных. Я также хочу создать резервную копию файла для будущей ссылки.

Ниже сценарий, который я пытался записать, все еще неполный. Я понятия не имею, как сделать эту работу.

#!/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

Вывод:

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
2
задан 29 June 2015 в 17:13

2 ответа

Используя awk для создания SQL-запроса:

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

Пример произвел:

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");

Или больше полной версии:

#!/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
0
ответ дан 3 December 2019 в 00:17

В Python

В одном - (долго-) лайнер:

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

где 'f' является исходным файлом между (двойными) кавычками.

Вывод:

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

Выписанный в 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])
  • Если Вы предпочитаете версию сценария, Копия это в пустой файл, сохраняете ее как extract_data.py, выполните его с файлом как аргумент:
    python3 /path/to/extract_data.py /path/to/sourcefile

Подробно, "уменьшение масштаб":

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

читает файл, разделяет его на строки

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

создает список тех строк, разделенных в двух разделах разделителем _

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

наконец комбинирует два раздела на строку со строками:

service_id: 

и

mac_address: 

Править

Читая несколько (всех) файлов в каталоге сразу, нам нужны еще две строки в сценарии:

#!/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]

Хотя сценарий пропускает скрытые файлы и файлы, заканчивающиеся ~, это предполагает, что каталог только содержит читаемые и правильные файлы.

Используйте его точно в качестве первого сценария, но теперь только с каталогом как аргумент:

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

Пример произвел:

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
0
ответ дан 3 December 2019 в 00:17

Другие вопросы по тегам:

Похожие вопросы: