如何在 python 中获取带有分隔符 space 的列表的第 n 个参数
How to get the nth parameter of a list with delimiter space in python
新手python 学习者在这附近...
我想要实现的是从 iptables 日志文件中读取行,获取匹配 "SRC=" 的参数,删除字符串 "SRC=" 并打印出唯一的 IP。
在 Bash 中,使用 awk 等非常简单。
我阅读了理解列表和 re.function 并深入研究了示例,但没有成功。欢迎任何有关 lists/objects/strings 操作的提示。
代码:
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 中获取带分隔符“ ” (space) 的第 n 个参数?
一旦你有了一个只包含一行输入的字符串,你就可以
parts = line.split()
ip = parts[9][4:]
示例输出:
255.255.255.1
当然,您可能想对这些列表进行一些合适的范围检查!
string.split 将从单个字符串生成一个字符串列表,按您选择的分隔符分隔(默认情况下为 space)。
然后,您可以索引该列表以选择对应于 SRC=xx.xx.xx.xx
的列表,并使用 string slicing 到 return 仅包含 IP 地址的子字符串。
一种更可靠的方法可能是使用正则表达式来匹配 SRC=xx.xx.xx.xx
行并提取 IP 地址。
您可以使用str.split()
将元素按white-space 拆分,然后从中获取第10 个元素(即带有SRC=
的元素)。然后替换其中的 SRC=
,或者您可以简单地获取子字符串(使用下标 [4:]
删除前四个字符 'SRE='
)。
此外,如果您只想要独特的元素,可以在 Python 2.7 + .
中使用集合理解
例子-
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
但更好的方法(也是更慢的方法)是使用正则表达式。例子-
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
最后采用了这种方法:
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]
新手python 学习者在这附近...
我想要实现的是从 iptables 日志文件中读取行,获取匹配 "SRC=" 的参数,删除字符串 "SRC=" 并打印出唯一的 IP。 在 Bash 中,使用 awk 等非常简单。 我阅读了理解列表和 re.function 并深入研究了示例,但没有成功。欢迎任何有关 lists/objects/strings 操作的提示。
代码:
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 中获取带分隔符“ ” (space) 的第 n 个参数?
一旦你有了一个只包含一行输入的字符串,你就可以
parts = line.split()
ip = parts[9][4:]
示例输出: 255.255.255.1
当然,您可能想对这些列表进行一些合适的范围检查!
string.split 将从单个字符串生成一个字符串列表,按您选择的分隔符分隔(默认情况下为 space)。
然后,您可以索引该列表以选择对应于 SRC=xx.xx.xx.xx
的列表,并使用 string slicing 到 return 仅包含 IP 地址的子字符串。
一种更可靠的方法可能是使用正则表达式来匹配 SRC=xx.xx.xx.xx
行并提取 IP 地址。
您可以使用str.split()
将元素按white-space 拆分,然后从中获取第10 个元素(即带有SRC=
的元素)。然后替换其中的 SRC=
,或者您可以简单地获取子字符串(使用下标 [4:]
删除前四个字符 'SRE='
)。
此外,如果您只想要独特的元素,可以在 Python 2.7 + .
中使用集合理解例子-
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
但更好的方法(也是更慢的方法)是使用正则表达式。例子-
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
最后采用了这种方法:
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]