if循环语句是怎么写的?

if循环语句是怎么写的?

cat 08old_gongji_IP.txt 
2023/7/16封锁       23.24.11.195  22.92.21.180/phpmyadmin/index.php
2023/7/17封锁       11.43.128.214  22.92.21.181/phpmyadmin/index.php
2023/7/17封锁       11.43.128.214  22.92.21.179/phpmyadmin/index.php
2023/7/17封锁       11.43.128.214  22.92.21.178/phpmyadmin/index.php
2023/7/17封锁       11.43.128.214  22.92.21.180/phpmyadmin/index.php
2023/7/17封锁       11.43.128.214  22.92.21.182/phpmyadmin/index.php
2023/7/17封锁       11.43.128.214  58.11.11.138/phpmyadmin/index.php
2023/7/17封锁       11.43.128.214  58.11.11.140/phpmyadmin/index.php
2023/7/17封锁       11.43.128.214  58.11.11.139/phpmyadmin/index.php
2023/7/6封锁        11.43.128.214  22.92.21.181/phpmyadmin/index.php
2023/7/6封锁        11.43.128.214  22.92.21.179/phpmyadmin/index.php
2023/7/6封锁        11.43.128.214  22.92.21.182/phpmyadmin/index.php
2023/7/6封锁        11.43.128.214  22.92.21.180/phpmyadmin/index.php
2023/7/6封锁        11.43.128.214  22.92.21.178/phpmyadmin/index.php
2023/5/31封锁       11.43.128.214  22.92.21.178/phpmyadmin/index.php
2023/5/31封锁       11.43.128.214  22.92.21.180/phpmyadmin/index.php
2023/5/31封锁       11.43.128.214  22.92.21.181/phpmyadmin/index.ph

cat 08check_chongfu_gongji_ip.txt 
23.24.11.195
11.43.128.214

08check_chongfu_gongji_ip.txt  是要查找以前是否有攻击IP的列表
08old_gongji_IP.txt  是以前攻击IP的汇总表
想通过脚本,输出成以下格式
23.24.11.195  | 2 | 2023/7/16封锁       23.24.11.195  22.92.21.180/phpmyadmin/index.php
23.24.11.195  | 2 | 2023/7/16封锁       23.24.11.195  22.92.21.180/phpmyadmin/index.php
11.43.128.214 | 16| 2023/5/31封锁       11.43.128.214  22.92.21.178/phpmyadmin/index.php
11.43.128.214 | 16| 2023/5/31封锁       11.43.128.214  22.92.21.180/phpmyadmin/index.php
11.43.128.214 | 16| 2023/5/31封锁       11.43.128.214  22.92.21.181/phpmyadmin/index.ph
11.43.128.214 | 16| 2023/7/6封锁        11.43.128.214  22.92.21.181/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/6封锁        11.43.128.214  22.92.21.179/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/6封锁        11.43.128.214  22.92.21.182/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/6封锁        11.43.128.214  22.92.21.180/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/6封锁        11.43.128.214  22.92.21.178/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/17封锁       11.43.128.214  22.92.21.181/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/17封锁       11.43.128.214  22.92.21.179/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/17封锁       11.43.128.214  22.92.21.178/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/17封锁       11.43.128.214  22.92.21.180/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/17封锁       11.43.128.214  22.92.21.182/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/17封锁       11.43.128.214  58.11.11.138/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/17封锁       11.43.128.214  58.11.11.140/phpmyadmin/index.php
11.43.128.214 | 16| 2023/7/17封锁       11.43.128.214  58.11.11.139/phpmyadmin/index.php
注意 |16| 右边的数据是按日期排序的,且11.43.128.214的记录行数不一定是16行,可能是几千行,也可能是几行

写了一个如下的脚本,但达不到要求,求指导,谢谢!
#!/bin/sh
set -x 

echo -n > pls_08check_chongfu_gongji_ip.txt
sed -i '/^$/d' 08old_gongji_IP.txt
sed -i '/^$/d' 08check_chongfu_gongji_ip.txt
sed -i '/^$/d' pls_08check_ip
echo -n > pls_08chongfu_cishu.txt
echo -n>pls_08check_ip

while read line
do
r=`grep "$line"  08old_gongji_IP.txt|wc -l`
if [  "$r" = "0" ]
then
    echo "$line was not found num=0" 

else
   echo "$line is found num>=1"
   echo "$line" >>pls_08check_ip
   i=1
   if ["$i" -lt $r ]
   then
        exit0
   else  
        if [ "$i" -lt "$r" ]
        then
        jilu=`grep "$line"  08old_gongji_IP.txt` |head -n "$i" |tail -n 1 
        echo "$line | $r | $jilu" >>pls_08chongfu_cishu.txt
        i=i++
        else
          exit 0 
        fi
   fi 
fi
done <08check_chongfu_gongji_ip.txt

sort -u pls_08check_ip >> pls_08check_chongfu_gongji_ip.txt
sed -i '/^$/d' pls_08check_chongfu_gongji_ip.txt
# echo -n >08check_chongfu_gongji_ip.txt
rm -f  pls_08check_ip

sz    pls_08check_chongfu_gongji_ip.txt
cat   pls_08check_chongfu_gongji_ip.txt

sz  pls_08chongfu_cishu.txt
cat pls_08chongfu_cishu.txt

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
if循环语句在bash脚本中的写法如下:

if [ condition ]; then
    # Code to be executed if the condition is true
else
    # Code to be executed if the condition is false
fi

在你提供的脚本中,有一些语法错误和逻辑问题。我将为你提供一个修正后的脚本,以满足你的要求:

#!/bin/bash

echo -n > pls_08check_chongfu_gongji_ip.txt
sed -i '/^$/d' 08old_gongji_IP.txt
sed -i '/^$/d' 08check_chongfu_gongji_ip.txt
sed -i '/^$/d' pls_08check_ip
echo -n > pls_08chongfu_cishu.txt
echo -n > pls_08check_ip

while read -r line; do
    r=$(grep -c "$line" 08old_gongji_IP.txt)
    if [ "$r" -eq 0 ]; then
        echo "$line was not found num=0"
    else
        echo "$line is found num>=1"
        echo "$line" >> pls_08check_ip
        i=1
        while [ "$i" -le "$r" ]; do
            jilu=$(grep "$line" 08old_gongji_IP.txt | head -n "$i" | tail -n 1)
            echo "$line | $r | $jilu" >> pls_08chongfu_cishu.txt
            i=$((i+1))
        done
    fi
done < 08check_chongfu_gongji_ip.txt

sort -u pls_08check_ip >> pls_08check_chongfu_gongji_ip.txt
sed -i '/^$/d' pls_08check_chongfu_gongji_ip.txt

sz pls_08check_chongfu_gongji_ip.txt
cat pls_08check_chongfu_gongji_ip.txt

sz pls_08chongfu_cishu.txt
cat pls_08chongfu_cishu.txt

此脚本会根据给定的IP列表 08check_chongfu_gongji_ip.txt08old_gongji_IP.txt 中查找匹配的行,并输出到文件 pls_08check_chongfu_gongji_ip.txtpls_08chongfu_cishu.txt 中。请确保脚本和输入文件位于同一目录中,并具有执行权限。

希望这可以帮助到你!


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

引用 皆我百晓生 小程序回复内容作答:
以下是您的脚本中的一些问题:

  1. 在判断条件中,应该使用双等号(==)而不是单等号(=)。
  2. 在while循环的最后,一直处于循环中的exit 0应该换成continue,以继续下一次迭代。
  3. 在head和tail命令的括号周围有多余的空格。
  4. 变量i应该在循环的外部初始化,并且在每次循环迭代时递增。
  5. 在向文件中写入数据时,应该使用echo命令而不是直接使用重定向。

这是更新后的脚本:

#!/bin/bash

echo -n > pls_08check_chongfu_gongji_ip.txt
sed -i '/^$/d' 08old_gongji_IP.txt
sed -i '/^$/d' 08check_chongfu_gongji_ip.txt
sed -i '/^$/d' pls_08check_ip
echo -n > pls_08chongfu_cishu.txt
echo -n > pls_08check_ip

i=1
while read line
do
    r=$(grep -c "$line" 08old_gongji_IP.txt)
    if [ "$r" -eq 0 ]; then
        echo "$line was not found num=0"
    else
        echo "$line is found num>=1"
        echo "$line" >> pls_08check_ip
        while [ "$i" -le "$r" ]
        do
            jilu=$(grep "$line" 08old_gongji_IP.txt | head -n "$i" | tail -n 1)
            echo "$line | $r | $jilu" >> pls_08chongfu_cishu.txt
            i=$((i+1))
        done
    fi
    i=1
done < 08check_chongfu_gongji_ip.txt

sort -u pls_08check_ip >> pls_08check_chongfu_gongji_ip.txt
sed -i '/^$/d' pls_08check_chongfu_gongji_ip.txt

sz pls_08check_chongfu_gongji_ip.txt
cat pls_08check_chongfu_gongji_ip.txt

sz pls_08chongfu_cishu.txt
cat pls_08chongfu_cishu.txt

此脚本将会执行以下操作:

  1. 清空 pls_08check_chongfu_gongji_ip.txt 文件。
  2. 去除 08old_gongji_IP.txt08check_chongfu_gongji_ip.txtpls_08check_ip 文件中的空行。
  3. 初始化变量 i 为 1。
  4. 逐行读取 08check_chongfu_gongji_ip.txt 文件,并在 08old_gongji_IP.txt 中查找匹配行数。
  5. 如果找不到匹配行,则输出相关信息。
  6. 如果找到匹配行,则将匹配的 IP 写入 pls_08check_ip 文件,并遍历每一个匹配行并写入 pls_08chongfu_cishu.txt
  7. 最后,对去重后的 pls_08check_ip 文件进行排序,并输出文件的大小和内容。
  8. 同样,输出去重后的 pls_08chongfu_cishu.txt 文件的大小和内容。

援引讯飞星火:
在这个问题中,我们需要将两个文件(08old_gongji_IP.txt 和 08check_chongfu_gongji_ip.txt)中的数据进行处理,然后将处理后的数据按照指定的格式输出。我们可以使用 shell 脚本来实现这个功能。

首先,我们需要读取 08old_gongji_IP.txt 文件中的每一行数据,然后查找这些数据在 08check_chongfu_gongji_ip.txt 文件中的出现次数。接下来,我们需要将这些数据按照指定的格式输出。

下面是一个实现这个功能的 shell 脚本:

#!/bin/sh

# 创建临时文件
tmp1=$(mktemp)
tmp2=$(mktemp)

# 处理 08old_gongji_IP.txt 文件
grep -hE "^$(cat 08check_chongfu_gongji_ip.txt | awk '{print $1}')" 08old_gongji_IP.txt > $tmp1

# 统计每个 IP 出现的次数
sort -u $tmp1 > $tmp2

# 处理 08check_chongfu_gongji_ip.txt 文件
while read line; do
    count=$(grep -c "$line" $tmp2)
    echo "$line | $count"
done < 08check_chongfu_gongji_ip.txt

# 删除临时文件
rm $tmp1
rm $tmp2

将上述代码保存为一个名为 process_data.sh 的文件,然后在终端中运行以下命令使其可执行:

chmod +x process_data.sh

最后,运行脚本:

./process_data.sh

脚本将会按照指定的格式输出处理后的数据。

【以下回答由 GPT 生成】

回答:

在Linux中,可以使用if语句在Shell脚本中实现条件判断和循环控制。if语句的基本语法如下:

if condition
then
    # 当条件满足时执行的代码块
else
    # 当条件不满足时执行的代码块
fi

其中,condition是一个表达式,用于判断某个条件是否成立。可以使用各种比较运算符(如-eq-ne-lt-gt-le-ge等)来比较数值或字符串,也可以使用逻辑运算符(如&&||)组合多个条件。

以下是一些示例代码来展示如何使用if语句的不同用法:

  1. 检查文件是否存在:
if [ -f "myfile.txt" ]; then
    echo "文件存在"
else
    echo "文件不存在"
fi
  1. 判断两个数的大小关系:
a=10
b=20
if [ $a -lt $b ]; then
    echo "a小于b"
elif [ $a -gt $b ]; then
    echo "a大于b"
else
    echo "a等于b"
fi
  1. 判断一个字符串是否为空:
str="hello"
if [ -z "$str" ]; then
    echo "字符串为空"
else
    echo "字符串不为空"
fi
  1. 使用逻辑运算符组合多个条件:
score=85
if [ $score -ge 90 ] && [ $score -le 100 ]; then
    echo "优秀"
elif [ $score -ge 80 ] && [ $score -lt 90 ]; then
    echo "良好"
elif [ $score -ge 60 ] && [ $score -lt 80 ]; then
    echo "及格"
else
    echo "不及格"
fi

以上是一些基本示例,你可以根据具体情况修改condition以及相应的执行代码块。希望这些示例能帮助你更好地理解在Linux中编写if循环语句的用法。如果你有任何进一步的问题,请随时提出。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^