首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果满足多个条件,则删除文件

如果满足多个条件,则删除文件
EN

Ask Ubuntu用户
提问于 2021-11-24 15:17:40
回答 5查看 1.1K关注 0票数 13

我需要什么

我有一个现有的脚本,它可以提取域的端口信息并将其存储到一个名为portscan.txt的文本文件中。示例:

portscan.txt文件:

代码语言:javascript
复制
somedomain.com:80
somedomain.com:443

我只想在符合某些条件的情况下才删除这些资料。这些条件包括:

  • 具有域的文件应该有2行或更少的行。
  • 端口应该仅为80或443 (也就是说,如果文件中存在8080、8443或任何其他端口,我不想删除该文件)。

注:因此,基本上,上面提供的示例文件应该被删除,但如果有2行,我不想删除该文件,但是端口是8080或8443 (或其他端口),如下所示:

代码语言:javascript
复制
somedomain.com:8443
somedomain.com:443

这应该被删除而不是

我试过什么

我尝试用脚本编写出来,下面是我所拥有的:

代码语言:javascript
复制
#!/bin/bash

lines=$(cat portscan.txt | wc -l)
ports=$(cat portscan.txt | grep -Pv '(^|[^0-9])(80|443)($|[^0-9])')


if [[ $lines < 3 ]] && [[ $ports != 80 ]]; then
    if [[ $ports != 443 ]]; then
        echo "I need to delete this"
    fi
else
    echo "I will NOT delete this..."
fi

这是脚本的第二次呈现,我尝试嵌套if语句,因为我无法执行这样的条件:

如果 portscan.txt小于两行,则端口不是 80 443

我还尝试了这样一种简单得多的方式:

代码语言:javascript
复制
#!/bin/bash

lines=$(cat portscan.txt | wc -l)
ports=$(cat portscan.txt | grep -Pv '(^|[^0-9])(80|443)($|[^0-9])')


if [[ $lines < 3 ]] && (( $ports != 80||443 )); then
    echo "I need to delete this"
else
    echo "I will NOT delete this..."
fi

我尝试了((,因为我读到这更好地用于算术函数--这正是我认为我需要的,但当它应该是"This 那个那个“时,我对条件参数不那么了解。

希望这是有意义的,任何帮助都将不胜感激!

EN

回答 5

Ask Ubuntu用户

回答已采纳

发布于 2021-11-24 16:17:43

代码语言:javascript
复制
checkfile() {
    awk '
        BEGIN {
            FS = ":"
            status = 1
            ports[80] = 1
            ports[443] = 1
        }
        NR == 3 || !($2 in ports) {status = 0; exit}
        END {exit status}
    ' "$1"
}

file=portscan.txt
checkfile "$file" || echo rm -- "$file"

如果文件有第3行,或者看到“非标准”端口,awk命令将退出状态为0。

如果函数返回非零(文件有<= 2行,只有“标准”端口),那么rm命令就会被打印出来。

如果结果看起来正确,请删除echo

交替:

代码语言:javascript
复制
checkfile() {
    # if more than 2 lines, keep the file
    (( $(wc -l < "$1") > 2 )) && return 0

    # if a "non-standard" port exists, keep the file
    grep -qv -e ':80或者,更简洁checkfile() {
    (( $(wc -l < "$1") > 2 )) || grep -qv -e ':80 -e ':443或者,更简洁A3 "$1" && return 0

    # delete the file
    return 1
}或者,更简洁A3 -e ':443 -e ':443或者,更简洁A3 "$1" && return 0

    # delete the file
    return 1
}

或者,更简洁

A3 "$1" } -e ':443

或者,更简洁

A3 "$1" && return 0 # delete the file return 1 }

或者,更简洁

A3

票数 9
EN

Ask Ubuntu用户

发布于 2021-11-24 16:04:40

好的,试试这个

代码语言:javascript
复制
[~/my_learning/lint]$ cat file.txt
somedomain.com:80
somedomain.com:443
[~/my_learning/lint]$ cat file_dont_delete.txt
somedomain.com:8443
somedomain.com:443

[~/my_learning/lint]$ for file in file.txt file_dont_delete.txt
do
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 ] ; then
echo "$file can be deleted"
else
echo "$file can't be deleted"
fi
done

# Output
file.txt can be deleted
file_dont_delete.txt can't be deleted

我遵循以下条件

  • 第2行或小于或2行的数目。
  • 对于每一行,我使用awk提取字段2,这是一个端口,并检查它是80还是443,在任何情况下,我都打印matching
  • 那我就数一下有多少匹配发生了。
  • 根据您的描述,即使一个端口不是来自80或443,我也不应该删除该文件。

谢谢您给我这个编写shell代码的机会。

票数 3
EN

Ask Ubuntu用户

发布于 2021-11-25 14:06:05

纯bash解决方案,封装在一个函数中,易于阅读:

代码语言:javascript
复制
#!/bin/bash

possiblyDeleteFile() {
    local count=0
    local rLine port
    local otherPort=false
    while IFS= read -r -d'' rLine; do
        port="${rLine#*:}"
        ((count++))
        if [ "$port" != 80 ] && [ "$port" != 443 ]; then
            otherPort=true
        fi
    done < "$1"
    if [ $count -le 2 ] && ! $otherPort; then
        echo "Deleting file $1"
        rm -- "$1"
    fi
}

possiblyDeleteFile "$1"
票数 1
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1377370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档