Intereting Posts
Почему этот системный ресурс не ограничен? Как работает отладчик в Linux? Как расширить рабочий стол на мой второй монитор, а не просто клонировать его? Инструмент командной строки для получения информации поставщика OUI с MAC-адреса? Как переопределить пользовательский курсор мыши с помощью Xcursor? Показать текущий адрес электронной почты в строке состояния Mutt Индикатор выполнения в updatedb Загрузка с раздела жесткого диска. Update-grub? невозможно открыть основной объект документа tell dnf как ссылаться на установленную библиотеку Ограничение пользователей с помощью неработающих групп (для меня) Запустить программу с более низкой скоростью процессора? Как найти расположение всех файлов с определенным именем, содержимое которого содержит определенную строку? попытка избежать цитат как регистратор доменов обновляет корневые DNS-серверы

Как преобразовать мои текстовые файлы (каждый из которых содержит пару имени пользователя + пароль) в CSV, чтобы импортировать их в KeePass через bash (cygwin)

Я бы хотел использовать Keepass (win10x64).

Проблема в том, что у меня есть пароли, собранные все эти годы:
каждая пара имени пользователя / пароля в отдельном текстовом файле,
имея в качестве имени файла доменное имя соответствующего пароля,
и внутри каждого .txt-файла, первая строка – это имя пользователя, а второй – пароль (оба без префикса).

Например:

Имя файла: reddit.com (он также имеет расширение .txt, но это может быть опущено). Содержание:

 my_username my_Password 

Чтобы вышеперечисленное стать CSV, оно должно быть преобразовано в:

 "Account","Login Name","Password","Web Site", "Notes" "Entry 1","my_username","my_password","http://reddit.com", "" 

т.е.

 "Account","Login Name", "Password", "Web Site", "Notes" "Entry 1","my_username", "my_password", "http://reddit.com", "" 

Примечание: если в пароле есть запятая ( , ), двойная кавычка ( " ) или обратная косая черта ( \ ), она должна быть экранирована с помощью обратного слэша.

Как это можно сделать с помощью сценария bash (cygwin)?


Кодовые фрагменты, которые я собрал до сих пор:

  1. Как я могу добавить строку к началу каждой строки в файле? ( источник )

     awk '{print "prefix" $0}' file 
  2. Печать nth Line из файла file.txt ( источник )

     awk "NR==2{print;exit}" file.txt // for printing the 2nd line 
  3. выполнить команду для всех найденных файлов рекурсивно

     find . -name "*.txt" -execdir *command* 

    или альтернативно

     for file in /cygdrive/c/folder/*; do *command* // command example: mv "$file" "${file}/.." done 

Итак, мой скрипт должен начинаться с:

 find . -name "*.txt" -execdir awk '{print '"Account","Account","Login Name","Password","Web Site", "Notes"' $0}' "$file" 

Я застрял в этом вопросе.

Входные файлы:

  1. yahoo.net.txt
  2. gougle.com.txt
  3. reddit.com.txt

Содержание yahoo.net.txt :

 user1-yaho0 pas,, 

Содержание gougle.com.txt :

 user1-google pas"wor,d 

Содержание reddit.com.txt :

 user1-reddit pas\wor\d 

С помощью этого ввода следующий быстрый и грязный сценарий выполняет эту работу:

 #!/bin/bash echo "\"Account\",\"Login Name\",\"Password\",\"Web Site\",\"Notes\"" > output.csv num=0 for f in `find . -type f -name '*.txt'` ; do num=$((num + 1)) user=`head -1 "$f"` password=`sed 1d "$f" | sed -r 's/([\\,"])/\\\\\1/g'` domain=`basename "$f" | sed 's/\.txt$//'` echo "\"$num\",\"$user\",\"$password\",\"$domain\",\"\"" >> output.csv done 

Содержание output.csv :

 "Account","Login Name","Password","Web Site","Notes" "1","user1-reddit","pas\\wor\\d","reddit.com","" "2","user1-yaho","pas\,\,","yahoo.net","" "3","user1-google","pas\"wor\,d","gougle.com","" 

С awk

  awk 'BEGIN{print "\"Account\",\"Login Name\",\"Password\",\"Web Site\",\"Notes\""} { if (FNR==1){ user=$0;a+=1}; if(FNR==2){ print "\""a"\",\""user"\",\""$0"\",\""gensub(/\.txt/,"","",FILENAME)"\","}}' *.txt 

Используйте специальную переменную FNR awk, чтобы получить 1-ю и 2-ю строки из каждого *.txt файла и функции манипуляции строкой gensub для удаления .txt из FILENAME (специальной переменной awk ) для столбца URL.