我有一个输入文件,其中包含:
19:04:01.631948 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:02.061482 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:03.583896 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:04.005483 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:05.511947 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:05.997361 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:07.427876 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:07.925385 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:09.403864 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:09.845241 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:10.877531 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto IGMP (2), length 28)
我希望输出如下:
181.173.82.61
and other ips
(just senders IP (left IP))
我在 grep 中尝试了以下正则表达式:
grep -E -o '[1-9][0-9][0-9]?\.[1-9][0-9][0-9]?\.[0-9][0-9][0-9]?\.[0-9][0-9][0-9]?\.\s\>
为了解决这个问题,我尝试按照以下格式检查 IP:
(ip)(port)(space)(>)
然后使用 sed 删除 > 和端口号,但我的正则表达式不起作用。
我会很感激任何其他方法,例如 awk 或更好的正则表达式。
答案1
如果你想要的只是每行的第一个 IP,你可以这样做:
grep '>' file.txt | gawk '{print $1}' | cut -d "." -f -4
示例文件上的输出:
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
解释:
grep '>' file.txt
:仅打印包含字符的行>
。在您发布的文件中,这些是以 IP 开头的行。grep '>' file.txt | head -1 181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
gawk '{print $1}'
:打印每行的第一个字段。grep '>' file.txt | gawk '{print $1}' | head -1 181.173.82.61.1985
cut -d "." -f -4
: 用作.
字段分隔符并打印到第 4 个字段的所有内容。这会从 IP 中删除多余的数字。grep '>' file.txt | gawk '{print $1}' | cut -d "." -f -4 | head -1 181.173.82.61
答案2
现在,您的正则表达式仅在寻找格式为的 IP xxx.xxx.xxx.xxx
,但 IP 可以是x.x.x.x
介于两者之间的任何内容xxx.xxx.x.xx
(在您的示例中:xxx.xxx.xx.xx
对于 IP 部分)。
所以这意味着你的正则表达式需要看起来更像:
'[1-9]{1,3}\.[0-9}{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,4} >'
意思是“我希望 1-9 连续出现在 1 到 3 的任意位置,后面跟着一个‘.’,然后是 0-9 连续出现在 1-3 的任意位置”,等等。对我来说,没有 也可以?
,仅供参考。
由于您明确地说了“空间和>”,因此您不需要过于花哨。
答案3
我很确定它可以做得比这更好,但如果我将您的示例复制到测试文件并删除标记(开头的额外 4 个空格),那么这可以工作:
>cat testfile | grep -E "[1-9]{1,3}\.[0-9}{1,3}\.[0-9]{1,3}\.[1-9]{1,3}" | cut -d. -f1-4
grep 过滤器的输出结果如下:
181.173.82.61.1985 > 250.66.33.195.1985:HSRPv0-hello 20:状态=活动组=72 地址=171.64.72.1 hellotime=2s 保持时间=7s 优先级=120 auth="vlan72^@^@" 181.173.82.60.1985 > 250.66.33.195.1985:HSRPv0-hello 20:状态=备用组=72 地址=171.64.72.1 hellotime=2s 保持时间=7s 优先级=100 auth="vlan72^@^@" 181.173.82.61.1985 > 250.66.33.195.1985:HSRPv0-hello 20:状态=活动组=72 地址=171.64.72.1 hellotime=2s 保持时间=7s 优先级=120 auth="vlan72^@^@" 181.173.82.60.1985 > 250.66.33.195.1985:HSRPv0-hello 20:状态=备用组=72 地址=171.64.72.1 hellotime=2s 保持时间=7s 优先级=100 auth="vlan72^@^@"
然后使用剪切来抓取前四个字段(-f
对于字段,1-4 表示 1,2,3,4),使用点作为-d
消除符)。
答案4
我很惊讶没有人发布这个极其简单的grep
解决方案。我将示例文本复制并粘贴到名为的文本文件中,"ips.txt"
然后运行以下命令:
grep -Eo "^([0-9]{1,3}\.){3}[^. ]*" ips.txt
我得到的输出是:
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
如果您想要查看文件中的所有 IP_ADDR,只需省略^
grep 命令正则表达式开头的 即可。它将以列表形式显示所有 IP,以便您根据需要进一步筛选。
这恰好是与接受的答案完全相同的输出,只是没有使用那么多管道。只要您需要解析的文件在行首包含发送方 IP_ADDR,此命令就会满足您的需要。