Рейтинг:14

Удалить файл, если выполняются несколько условий

флаг ma

Что мне нужно

У меня есть сценарий, который извлекает информацию о портах для доменов и сохраняет ее в текстовом файле с именем портыскан.txt. Пример:

портыскан.txt файл:

какой-то домен.com: 80
какой-то домен.com: 443

Я хочу удалить информацию только при соблюдении определенных условий. Эти условия включают в себя:

  • Файл с доменами должен состоять из 2 и менее строк
  • Порты должны быть только 80 или 443 (т. е. я не хочу удалять файл, если в файле существует 8080, 8443 или любой другой порт).

Примечание: Итак, приведенный выше пример файла должен удалить, но я не хочу удалять файл, если есть 2 строки, но порты 8080 или 8443 (или любой другой порт, если на то пошло) Пример такой:

какой-то домен.com: 8443
какой-то домен.com: 443

Это должно нет быть удалены.

Что я пробовал

Я попытался написать это, и вот что у меня есть:

#!/бин/баш

строки=$(cat portscan.txt | wc -l)
порты=$(cat portscan.txt | grep -Pv '(^|[^0-9])(80|443)($|[^0-9])')


если [[ $lines < 3 ]] && [[ $ports != 80 ]]; тогда
    если [[ $ports != 443 ]]; тогда
        эхо "Мне нужно удалить это"
    фи
еще
    echo "Я НЕ удалю это..."
фи

Это второй рендеринг скрипта, я пробовал вложенный если утверждения, потому что я не смог выполнить такое условие:

ЕСЛИ portscan.txt меньше двух строк И порты НЕТ 80 ИЛИ ЖЕ 443

Я также попытался сделать это гораздо проще:

#!/бин/баш

строки=$(cat portscan.txt | wc -l)
порты=$(cat portscan.txt | grep -Pv '(^|[^0-9])(80|443)($|[^0-9])')


если [[ $lines < 3 ]] && (( $ports != 80||443 )); тогда
    эхо "Мне нужно удалить это"
еще
    echo "Я НЕ удалю это..."
фи

я пробовал (( потому что я читал, что это лучше использовать с арифметическими функциями - это то, что я думал, что мне нужно, но я не так хорошо разбираюсь в bash с условными аргументами, когда это должно быть так: "Это и что или же что".

Надеюсь, это имеет смысл, любая помощь будет принята с благодарностью!

Рейтинг:9
флаг cn
контрольный файл () {
    хорошо '
        НАЧИНАТЬ {
            ФС = ":"
            статус = 1
            порты[80] = 1
            порты[443] = 1
        }
        НР == 3 || !($2 в портах) {status = 0; выход}
        КОНЕЦ {статус выхода}
    "1 доллар"
}

файл=portscan.txt
контрольный файл "$file" || эхо rm -- "$ файл"

Эта команда awk завершится со статусом 0, если в файле есть третья строка или если он увидит «нестандартный» порт.

Если функция возвращает ненулевое значение (в файле <= 2 строки и только «стандартные» порты), то выводится команда rm.

Удалять эхо если результаты выглядят правильно.


Поочередно:

контрольный файл () {
    # если больше 2-х строк, сохранить файл
    (( $(wc -l < ​​"$1") > 2 )) && вернуть 0

    # если существует "нестандартный" порт, сохранить файл
    grep -qv -e ':80$' -e ':443$' "$1" && вернуть 0

    # удалить файл
    вернуть 1
}

или, короче

контрольный файл () {
    (( $(wc -l < ​​"$1") > 2 )) || grep -qv -e ':80$' -e ':443$' "$1"
}
Justin Washek avatar
флаг ma
Круто, это помогло, большое спасибо!
Рейтинг:3
флаг ph

Хорошо, попробуй это

[~/my_learning/lint]$ cat файл.txt
какой-то домен.com: 80
какой-то домен.com: 443
[~/my_learning/lint]$ cat file_dont_delete.txt
какой-то домен.com: 8443
какой-то домен.com: 443

[~/my_learning/lint]$ для файла в файле file.txt file_dont_delete.txt
делать
num_of_lines=$(wc -l $file| xargs | awk '{print $1}')
port_scan=$(awk -F':' '{ if (($2 == "443") || ($2 == "80")) print "matched" }' $file | wc -l | xargs)
if [$num_of_lines -le 2] && [$num_of_lines -eq $port_scan]; тогда
echo "$file можно удалить"
еще
echo "$file не может быть удален"
фи
сделано

# Вывод
файл.txt можно удалить
file_dont_delete.txt не может быть удален

Я соблюдаю следующие условия

  • количество строк 2 или менее или 2.
  • и для каждой строки я использовал awk, чтобы извлечь поле 2, которое является портом, и проверить, является ли оно 80 или 443, и на любом я печатаю соответствие.
  • Затем я подсчитываю, сколько совпадений произошло.
  • По твоему описанию хоть один порт не с 80 и не с 443 представлен, то файл удалять не стоит.

Спасибо за предоставленную мне возможность написать шелл-код.

Рейтинг:1
флаг cn

Решение на основе файла карты:

#!/бин/баш

shopt -s extglob

файл карты -tn3 a < $1
[[ ${#a[@]} -lt 3 ]] && { \
[[ ${#a[@]} -gt 0 && ${a[@]/%:@(80|443)} =~ :[0-9]+ ]] || эхо rm -v -- $1; }
Рейтинг:1
флаг cn

Чистое решение bash, завернутое в функцию и легко читаемое:

#!/бин/баш

возможноDeleteFile() {
    локальный счет = 0
    локальный порт rLine
    локальный другой порт = ложь
    в то время как IFS= читать -r -d'' rLine; делать
        порт="${rLine#*:}"
        ((количество++))
        if [ "$port" != 80 ] && [ "$port" != 443 ]; тогда
            другой порт = истина
        фи
    сделано < "$1"
    если [ $count -le 2 ] && ! $другой порт; тогда
        echo "Удаление файла $1"
        гм -- "$1"
    фи
}

возможноDeleteFile "$1"
minnmass avatar
флаг in
Возможно, я что-то упускаю, я не понимаю, как это обрабатывает правило «2 или меньше» — если есть 3 строки, каждая из которых имеет порт 80, `count` не будет увеличиваться, поэтому файл не будет удален .
rexkogitans avatar
флаг cn
@minnmass Спасибо, я не правильно понял вопрос. Я починил это.
Рейтинг:-3
флаг in

Чтобы выполнить числовое сравнение в bash, вам нужно использовать -gt, -ltи т.д. < символ для перенаправления stdin.

Вы можете либо заключить сравнение номеров строк в (()), как вы сделали для порта, либо использовать -lt Видеть https://tldp.org/LDP/abs/html/comparison-ops.html

флаг hr
`

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.