python中如何获取带分隔符空格的列表的第n个参数

2024-04-19 23:16:01 发布

您现在位置:Python中文网/ 问答频道 /正文

这里的初学者。。。你知道吗

我试图实现的是从iptables日志文件中读取行,获取匹配“SRC=”的参数,删除字符串“SRC=”并打印出唯一的IPs。 在Bash中,使用awk等非常简单。 我读了关于理解列表和重功能深入挖掘例子,但没有成功。欢迎提供列表/对象/字符串操作的任何提示。你知道吗

代码:

import sys
import os
import re


with open("iptables.log","r") as f:
content = f.readlines()

print (type (content))
content = [l.replace('SRC=','') for l in content]

print (len(content))
print " ".join(content)

f.close()

日志:

Sep  1 09:27:46 hostname kernel: IPTables-Dropped: IN=eth0 OUT= MAC=00000 SRC=255.255.255.1 DST=10.0.0.1 LEN=56 TOS=0x00 PREC=0x00 TTL=10 ID=36829 DF PROTO=TCP SPT=490000 DPT=80 WINDOW=15500 RES=0x00 SYN URGP=0 MARK=0x32
Sep  1 09:27:47 hostname kernel: IPTables-Dropped: IN=eth0 OUT= MAC=00000 SRC=255.255.255.1 DST=10.0.0.1 LEN=56 TOS=0x00 PREC=0x00 TTL=10 ID=36830 DF PROTO=TCP SPT=490000 DPT=80 WINDOW=15500 RES=0x00 SYN URGP=0 MARK=0x32
Sep  1 09:27:47 hostname kernel: IPTables-Dropped: IN=eth0 OUT= MAC=00000 SRC=255.255.255.1 DST=10.0.0.1 LEN=56 TOS=0x00 PREC=0x00 TTL=10 ID=36830 DF PROTO=TCP SPT=490000 DPT=80 WINDOW=15500 RES=0x00 SYN URGP=0 MARK=0x32
Sep  1 09:27:47 hostname kernel: IPTables-Dropped: IN=eth0 OUT= MAC=00000 SRC=255.255.255.2 DST=10.0.0.1 LEN=56 TOS=0x00 PREC=0x00 TTL=10 ID=36830 DF PROTO=TCP SPT=490000 DPT=80 WINDOW=15500 RES=0x00 SYN URGP=0 MARK=0x32

打印内容应为:

255.255.255.1
255.255.255.2

如何在python中获取分隔符为“”(空格)的第n个参数?你知道吗


Tags: insrciptableslenmaccontentoutkernel
3条回答

您可以使用^{}将元素按空格分割,然后从中获取第10个元素(即带有SRC=的元素)。然后替换其中的SRC=,或者您可以简单地获取子字符串(通过使用下标[4:]删除前四个字符,即'SRE=')。你知道吗

另外,如果您只需要唯一的元素,那么可以在python2.7+中使用set comprehension。你知道吗

示例-

lstset = {l.split()[9].replace('SRC=','') for l in content}
print('\n'.join(lstset))

演示-

>>> content = """Sep  1 09:27:46 hostname kernel: IPTables-Dropped: IN=eth0 OUT= MAC=00000 SRC=255.255.255.1 DST=10.0.0.1 LEN=56 TOS=0x00 PREC=0x00 TTL=10 ID=36829 DF PROTO=TCP SPT=490000 DPT=80 WINDOW=15500 RES=0x00 SYN URGP=0 MARK=0x32
... Sep  1 09:27:47 hostname kernel: IPTables-Dropped: IN=eth0 OUT= MAC=00000 SRC=255.255.255.1 DST=10.0.0.1 LEN=56 TOS=0x00 PREC=0x00 TTL=10 ID=36830 DF PROTO=TCP SPT=490000 DPT=80 WINDOW=15500 RES=0x00 SYN URGP=0 MARK=0x32
... Sep  1 09:27:47 hostname kernel: IPTables-Dropped: IN=eth0 OUT= MAC=00000 SRC=255.255.255.1 DST=10.0.0.1 LEN=56 TOS=0x00 PREC=0x00 TTL=10 ID=36830 DF PROTO=TCP SPT=490000 DPT=80 WINDOW=15500 RES=0x00 SYN URGP=0 MARK=0x32
... Sep  1 09:27:47 hostname kernel: IPTables-Dropped: IN=eth0 OUT= MAC=00000 SRC=255.255.255.2 DST=10.0.0.1 LEN=56 TOS=0x00 PREC=0x00 TTL=10 ID=36830 DF PROTO=TCP SPT=490000 DPT=80 WINDOW=15500 RES=0x00 SYN URGP=0 MARK=0x32""".splitlines()
>>> lstset = {l.split()[9].replace('SRC=','') for l in content}
>>> print('\n'.join(lstset))
255.255.255.1
255.255.255.2

但更好的方法(也是更慢的方法)是使用regex。示例-

import re
reqset = {re.search('SRC=(\S+)',l).group(1) for l in content}
print('\n'.join(reqset))

演示-

>>> reqset = {re.search('SRC=(\S+)',l).group(1) for l in content}
>>> print('\n'.join(reqset))
255.255.255.1
255.255.255.2

一旦你有了一个只包含一行输入的字符串,你就可以这样做了

parts = line.split()
ip = parts[9][4:]

样本输出: 255.255.255.1条

当然,您可能需要对这些列表进行适当的范围检查!你知道吗

live example


string.split将从单个字符串生成一个字符串列表,并按您选择的分隔符(默认为空格)进行拆分。 然后可以对该列表编制索引,以选择与SRC=xx.xx.xx.xx相对应的列表,并使用string slicing返回仅包含IP地址的子字符串。你知道吗

一种更健壮的方法可能是使用正则表达式来匹配SRC=xx.xx.xx.xx行并提取IP地址。你知道吗

最后采用了这种方法:

import sys
import os
import re

for line in open("iptables.log","r"):

 list = line.strip().split(" ")
 if re.search("SRC=", line):

  ip = list[10].strip().split("=")
  print ip[1]

相关问题 更多 >