Как пропустить повторяющиеся записи в файле .csv - PullRequest
3 голосов
/ 02 февраля 2020

Я новичок в bash сценариях. У меня есть текстовый файл, содержащий список поддоменов (URL), и я создаю файл .csv (subdomainIP.csv), который имеет 2 столбца: 1-й столбец содержит субдомены (Subdomain), а 2-й содержит IP-адреса (IP) , Столбцы разделены знаком ",". Мой код предназначен для чтения каждой строки URLs.txt, находит его IP-адрес и вводит выбранный поддомен и его IP-адрес в файл .csv.

Всякий раз, когда я нахожу IP-адрес домена и хочу добавить его в качестве новой записи в файл .csv, я хочу проверить предыдущие записи 2-го столбца. Если есть подобный IP-адрес, я не хочу добавлять новую запись, но если нет подобного случая, я хочу добавить новую запись. Я сделал это, добавив эти строки в мой код:

awk '{ if ($IP ~ $ipValue) print "No add"
            else echo "${line}, ${ipValue}" >> subdomainIP.csv}'  subdomainIP.csv

, но получаю эту ошибку:

awk: cmd. line:2:       else echo "${line}, ${ipValue}" >> subdomainIP.csv}
awk: cmd. line:2:                                       ^ syntax error

Что не так?

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Не могли бы вы попробовать следующее:

declare -A seen                         # memorize the appearance of IPs
echo "Subdomain,IP" > subdomainIP.csv   # let's overwrite, not appending
while IFS= read -r line; do
    ipValue=                            # initialize the value
    while IFS= read -r ip; do
        if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            ipValue+="${ip}-"           # append the results with "-"
        fi
    done < <(dig +short "$line")        # assuming the result has multi-line
    ipValue=${ipValue%-}                # remove trailing "-" if any
    if [[ -n $ipValue ]] && (( seen[$ipValue]++ == 0 )); then
                # if the IP is not empty and not in the previous list
        echo "$line,$ipValue" >> subdomainIP.csv
    fi
done < URLs.txt
  • Ассоциативный массив seen может быть ключевым для этой цели. Он индексируется произвольной строкой (IP-адрес в данном случае) и может запомнить значение, связанное со строкой. Будет удобно проверить внешний вид IP-адреса в строках ввода.
0 голосов
/ 03 февраля 2020

В вашем коде есть некоторые проблемы. Вот несколько из них.

  • Если скрипт awk заключен в одинарные кавычки, как в awk 'script' file, любые переменные $var в script не будут расширяться. Если вы хотите выполнить расширение переменной, используйте двойные кавычки. Сравните echo hello | awk "{ print \"$PATH\" }" против echo hello | awk '{ print "$PATH" }'.
  • Однако, если вы это сделаете, оболочка попытается расширить $0, $1, $NF, ... и это, конечно, не то, что ты хочешь. Поэтому вы можете объединять строки в одинарных и двойных кавычках по мере необходимости, например echo hello | awk '{ print "$0:"$0 >> "log"; print "$PATH:'"$PATH"'" >> "log" }'
  • На основании того, что я вижу из O'Reilly's *1019* sed & awk , когда вы перенаправляете в файл из скрипта awk, вы должны заключить в кавычки имя файла, как я делал в приведенной выше команде для файла с именем log.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...