首页 > 试题广场 >

判断输入的是否为IP地址

[编程题]判断输入的是否为IP地址
  • 热度指数:17806 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
写一个脚本统计文件nowcoder.txt中的每一行是否是正确的IP地址。
如果是正确的IP地址输出:yes
如果是错误的IP地址,且是四段号码的话输出:no,否则的话输出:error
假设nowcoder.txt内容如下:
192.168.1.1
192.168.1.0
300.0.0.0
123
你的脚本应该输出:
yes
yes
no
error
示例1

输入

192.168.1.1
192.168.1.0
300.0.0.0
123

输出

yes
yes
no
error
awk -F. '{if(NF==4){for(i=1;i<=NF;i++){if($i<0||$i>255){print "no";next}}print "yes"}else{print "error"}}'

发表于 2025-02-26 23:56:26 回复(0)
awk '
    {
        if($0 ~ /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/){  # 网上找的IPv4正则
            print "yes";
        }else if($0 ~ /([0-9]+\.){3}[0-9]+/){ # 数字.数字.数字.数字
            print "no";
        }else{
            print "error";
        }
    }
'

发表于 2025-01-16 22:53:36 回复(0)
4     gawk '{
    5       if( $0 ~ /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ ){ # 合法ip
    6         print "yes"
    7       }
    8     else if( length($0)<7 || length($0)>15 || !( $0 ~ /^(([0-9]{1,3}\.){3}[0-9]{1,3})$/ )){ # 从长度和ip的基本格式判断
    9         print "error"
   10       }
   11      else { # 满足合法ip的基本形式, 但不是合法ip
    13       print "no"
   14      }
   15     }' "$1"
发表于 2024-08-30 17:42:40 回复(0)
#!/bin/bash
while read line; do
	{
        #分割,将所有的.作为分隔符
		array=(${line//'.'/' '})
        #消息
		msg="yes"
        if ((${#array[@]} != 4)); then
            echo error;    
			continue;
		fi
		for item in ${array[@]}; do
			{
                if (( !(0<=item && item<=255) ));then
                    msg="no"
                    break;
                fi
			}
		done
        echo $msg
	}
done

发表于 2023-10-27 15:05:11 回复(0)
方法一:
#!/bin/bash
#ip地址由四组八位二进制数字组成,每组数字范围是0~255
#方法1:使用awk加循环判断:分情况讨论,列数不为4输出error;列数为4四组数都在0~255之间输出yes,否则输出no
cat nowcoder.txt | awk -F "." '{
    if(NF == 4){
        for(i = 1;i <= 4;i++){
            if($i < 0 || $i > 255){
                print "no";
                break;
            }
        }

        if(i == 5) print "yes";
    }else{
        print "error";
    }
}'

方法二:
#!/bin/bash

#方法2:awk加0~255的正则表达式直接进行模式匹配
:<<EOF
1.合理的ip地址划分为:0-9 10-99 100-199 200-249 250-255,原则是尽量多的用[0-9]进行划分,比如200-249 
2.不合理的正则表达式是在判断ip地址是否是合理的ip地址后进行判断的,所以此时在 任意个0-任意个9(至少有一个数字)的
数据范围内的所有非0-255的数字都是非合理ip。说白了只要这个填数的位置有数就行不管是多少,而我们上一步剔除了合理ip的
数据,所以剩下有数的情况就是不合理的ip地址
EOF
cat nowcoder.txt | awk '{
    if($0 ~/^(([0-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/){
        print "yes";
    }else if($0 ~/^([0-9]+\.){3}[0-9]+$/){print "no";}
    else{print "error";}
}'

方法三:
#!/bin/bash

#方法3:while按行读入处理 + awk加0~255的正则表达式直接进行模式匹配
:<<EOF
注意几个点:1.定义ip的正则表达式时用单引号括起来,防止取变量值时把它解析成字符串,它类似于一个正则命令
2.正则表达式里的{3}只对它前一个字符或者前一个括号里面的所有字符重复三次,不是从开头开始重复
3.=~表示正则匹配与字符串的是否相等的判断
4.[]]可用于正则表达式的模式匹配,而[]没有这个功能
EOF

ip='^(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$'

while read line
do
    if [[ $line =~ ^([0-9]+\.){3}[0-9]+$ ]]
    then
        if [[ $line =~ $ip ]] #[[]]可用于正则表达式的模式匹配,而[]没有这个功能
        then
            echo yes
        else
            echo no
        fi
    else
        echo error
    fi
done < nowcoder.txt


发表于 2023-10-13 13:33:38 回复(0)
此题关键在于正则匹配
0-255数字匹配
- 0-99匹配表达式:[1-9]?[0-9]
- 100-199匹配表达式:1[0-9]{2}
- 200-249匹配表达式:2[0-4][0-9]
- 250-255匹配表达式:25[0-4]
- 0-255 匹配表达式:[1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]

正确ip的匹配表达式:^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])$

河边小石子题解如下:

#!/bin/bash

ip_yes='^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])$'
ip_no='^([0-9]+\.){3}([0-9]+)$'
while read line;
do
    if [[ $line =~ $ip_no ]];then  #注意=~
        if [[ $line =~ $ip_yes ]];then
            echo "yes"
        else
            echo "no"
        fi
    else
        echo "error"
    fi
done<./nowcoder.txt
发表于 2022-07-17 18:11:21 回复(0)
awk -F "." '{
    if (NF!=4){
        print "error";
        next
    }
    for (i=1;i<=4;i++){
        if ($i>255 || $i<0){
            print "no";
            break
        }
        if (i == 4){
            print "yes"
        }
    }

}' nowcoder.txt
发表于 2022-07-12 19:58:07 回复(0)
#! /bin/bash
awk '{len=split($1,arr,".");if(len != 4){print "error"}else{if(arr[1] == "192" && arr[2] == "168"){print "yes"}else{print "no"}}}' nowcoder.txt
发表于 2022-06-01 11:18:23 回复(0)
awk -F "." '
{
a=0;
for(i=1;i<=NF;i++)
{
    if(0 > $i || $i > 255)
    {
        a=1;
        break;
    }
}
if(NF!=4){print "error";}
else if(a==0){print "yes";}
else{print "no";}
}'
发表于 2022-05-10 13:08:03 回复(0)

awk -F "." '{ aa = 0;
if( NF == 4 )
{
aa = 1;
for(i = 1;i <= NF;i++)
{
if( $i > 255)
{
aa = 2;
}
}
}
if( aa==0 ){printf "error\n";}
if( aa==1 ){printf "yes\n";}
if( aa==2 ){printf "no\n";}
}'

发表于 2022-05-08 16:43:50 回复(0)
while read line; do
    num=$(echo $line|awk -F"." '{print NF}')
    if [ $num -ne 4 ]; then
        echo "error"
        continue
    fi

    flag=true
    for ip in $(echo  $line|awk -F. '{for(i=1;i<=NF;i++) print $i}'); do
        if [ $ip -gt 255 -o $ip -lt 0 ]; then
            flag=false
        fi
    done
    
    if [ $flag = true ]; then
        echo "yes"
    else
        echo "no"
    fi
done < nowcoder.txt

发表于 2022-04-10 02:06:03 回复(0)
cat nowcoder.txt | awk -F "." '{
  if(NF!=4) 
  {
     print "error"
  }
  else{
     for(i=0;i<NF;i++)
     {
        if(($i>255))
        {
           print "no"
           break;
        }
        if(i=NF-1)
        {
           print "yes"           
        }
     }
  }
}'
发表于 2022-03-20 19:37:41 回复(0)
awk -F. 'NF!=4{print "error";next}NF==4{f=1;for(i=1;i<=NF;i++){if($i>255||$i<0){f=0}}}{if(f){print "yes"}else{print "no"}}'
发表于 2022-03-01 11:32:24 回复(0)
 while read ip
 do
   if [[ $ip =~ ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[09][0-9]|[1-9][0-9]|[0-9])$ ]]; then
      echo "yes"
   elif [[ $ip =~ [0-9].[0-9].[0-9].[0-9] ]]; then
      echo "no"
   else 
      echo "error"
   fi
 
 done < nowcoder.txt

发表于 2022-01-13 23:06:45 回复(0)