【问题标题】:Grep first three octets of an IP addressgrep IP 地址的前三个八位字节
【发布时间】:2014-04-03 22:47:41
【问题描述】:

我已尝试多次尝试在多个文件中 grep ip 地址的前三个八位字节,但当第一个八位字节为一位或两位数时,它有时会捕获误报。

外壳是“SH”

(输入示例)

i = 5.79.78

$data中的for i收集了几个需要处理的IP地址。为简单起见 我只显示一个“i”值。

代码

max=5
data="$(cat $dir* | cut -d '.' -f 1-3 | awk -v max="$max" '{a[$0]++}END{for(i in a){if(a[i] > max){print i}}}' | sed 's/.*://')"

for i in $data; do
    ii="${i}."
    list=$(grep "$ii" $dir*)
done
echo "$list"

*输出 *

/tmp/aaa.txt:5.79.78.237
/tmp/aaa.txt:5.79.78.230
/tmp/aaa.txt:5.79.78.229
/tmp/aaa.txt:5.79.78.228
/tmp/aaa.txt:5.79.78.227
/tmp/ddd.txt:5.79.78.236
/tmp/sss.txt:95.79.78.95     False
/tmp/sss.txt:95.79.78.66     False
/tmp/sss.txt:95.79.78.48     False
/tmp/sss.txt:95.79.78.216    False
/tmp/sss.txt:95.79.78.163    False

但它会在我要查找的地址之前使用一个数字提取 IP 地址。 我试图添加一个尾随“。”但它仍然无法找到所有正确的匹配项。

尝试

list=$(grep -E "$i""\.[0-9]{1,3}" $dir*)
list=$(grep -e ^ "$ii" $dir*)
list=$(grep "\<$ii" $dir*)
list=$(grep "^$ii" $dir*)

(Also tried list="$grep "^$ii" $dir*)" (adding quotes)

【问题讨论】:

  • 您可以添加输入和预期输出的示例吗?
  • 它在顶部(示例)下,输出是包含前三个八位字节完全匹配的文件列表。
  • $(...) 不是 "sh" 而是 bashksh
  • @jm666,POSIX shell(例如dash)允许:pubs.opengroup.org/onlinepubs/9699919799/utilities/…
  • @glennjackman hm.. 必须阅读一下 - 我知道 old school “sh” 什么只知道反引号 :)

标签: bash grep


【解决方案1】:

供您参考

while read -r input
do
    if [ -z "$input" ]
    then
        continue
    fi
    ip3=`echo "$input." | sed 's/.*= *//'`
    regex=`echo $ip3 | sed 's/\./\\\./g'`
    grep -H "^$regex" /tmp/*.txt
done <<EOF
i = 5.79.78

i = 5.34.244
EOF

如果 /tmp/a.txt 包含

5.79.78.236
95.79.78.95

将打印

/tmp/a:5.79.78.236

【讨论】:

  • 注意“shell是'sh'”
【解决方案2】:
#!/bin/sh

data="5.79.78 5.34.244"
octet_re='([1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
n=0    
for prefix in $data; do
    n=$(expr $n + 1)
    echo "run $n"
    prefix=$( echo "$prefix" | sed 's/\./\\./g' )
    output=$( egrep "\<${prefix}\.${octet_re}\>" <<END

yes  5.79.78.123
no  95.79.78.124
no   5.34.244.256
no  15.34.244.127
yes  5.34.244.1
no   5-34.244.1
END
    )
    echo "$output"
done
run 1
yes  5.79.78.123
run 2
yes  5.34.244.1

【讨论】:

  • 输出应该只针对一个 IP 地址(基于前三个八位字节)。所以它会寻找 1.2.3。并显示目录中匹配 1.2.3 且第四个八位字节为 1-255 的所有文件
  • 以上输出不相关。他们只是展示了两个不同的例子。
  • 你的问题不清楚。如果您的第一条评论是真的,为什么要使用 for 循环?我在模仿那个。无论如何,我回答的要点是:使用单词边界(\&lt;\&gt;),并转义点(sed 命令)
  • 我试过使用 \
  • 这真的让我更加困惑。为什么是“最大”?您实际上并没有显示您的输入文件。无论如何,很高兴你找到了答案。
猜你喜欢
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多