Bash скрипт? Управление и отображение собранных данных из CSV-файла

Я пытаюсь написать сценарий, который может обнаружить мое присутствие дома. До сих пор я написал скрипт, который выводит данные из hcitool lescan в файл csv в следующем формате:

    TIMESTAMP MAC_ADDRESS_1 MAC_ADDRESS_2 AD_INFINITUM
    2018-09-22.11:48:34 FF:FF:FF:FF:FF:FF FF:FF:FF:FF:FF:FF FF:FF:FF:FF:FF:FF

Я пытаюсь выяснить, как написать сценарий для преобразования данных в формат с возможностью захвата - gnuplot - программа, которая будет использоваться для этого? Я думаю, что это потребует Баш? скрипт, который импортирует файл csv, сохраняя все метки времени, затем добавляя новый столбец в массив для каждого уникального MAC-адреса, а затем заполняет записи 1 или 0 в зависимости от того, обнаружен ли Mac-адрес в строке. Существуют ли какие-либо встроенные команды, которые могут помочь с этим или помочь мне самому?

Код, который я использовал для генерации.csv, находится здесь. Извините, это, вероятно, не самый красивый, поскольку я только начал с сценариями bash.

    cd /home/pi/projects/bluetooth_control;
    while true
    do
        echo 'reset hci0';
        sudo hciconfig hci0 down;
        sudo hciconfig hci0 up;
        echo 'timestamp';
        echo `date +%Y-%m-%d.%H:%M:%S` &> test1.csv;
        echo 'running scan';
        (sudo timeout 20 stdbuf -oL hcitool lescan | grep -Eo '(([A-Z]|[0-9]){2}:){5}([A-Z]|[0-9]){2}') &> test.csv;
        echo 'removing duplicates to test.csv';
        (sort test.csv | uniq) >> test1.csv;
        (paste -s test1.csv) >> data.csv;
        echo 'sleep for 60s';
        sleep 60;
    done

1 ответ

Решение

У меня было время поиграть, и в интересах завершения ответа я нашел решение, которое мне пришло в голову. Я не уверен, насколько эффективно запустить его в Bash против Python, но здесь идет речь:

#!/bin/bash
cd /home/pi/projects/bluetooth_control;
while true
do
echo 'reset hci0';
sudo hciconfig hci0 down;
sudo hciconfig hci0 up;
echo 'timestamp';

# Create necessary temp files
echo "temp" &> test1.csv;
echo `date +%Y-%m-%d.%H:%M:%S` &> test2.csv;
echo 'running scan';

# Filter out only MAC addresses
(sudo timeout 20 stdbuf -oL hcitool lescan | grep -Eo '(([A-Z]|[0-9]){2}:){5}([A-Z]|[0-9]){2}') &> /home/pi/projects/bluetooth_control/test.csv;
echo 'removing duplicates to test.csv';

# Append each unique value to test1.csv
(sort test.csv | uniq) >> test1.csv;

# For each line in test1.csv, add text to mac_database if it doesn't exist 
while read line 
    do 
    grep -q -F $line mac_database || echo $line >> mac_database
done <test1.csv 

# For each line in mac_database, run an if loop
while read line 
    do 
    # If $line from mac_database exists in test1.csv, then
    if grep -Fxq "$line" test1.csv
        then
            echo '1' >> test2.csv
        else
            echo '0' >> test2.csv
    fi
done <mac_database

# Convert file to csv format, and append to data.csv
(paste -s test2.csv) >> data.csv;
echo 'sleep for 60s';
sleep 60;
done

Надеюсь, это поможет любому, кто захочет сделать это в будущем.

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