我觉得这awk是一个更灵活的工具来完成这项任务。Python也可以使用,但你必须编写脚本而不是复制和粘贴终端命令。您将不得不更改正则表达式模式,记录分隔符和字段分隔符,以便它们可以处理您的文件。如果您可以提供文件中的示例(删除或更改敏感数据),我将编辑此答案。
测试文件(从另一个SO示例复制并调整):
lease 192.23.253.2 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
lease 192.23.253.3 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
lease 192.23.253.4 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
lease 192.23.253.5 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
}
lease 192.23.253.6 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:01;
uid 00:00:00:00:00:01;
client-hostname "examle-workstation2";
}
lease 192.23.253.7 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 01:00:00:00:00:00;
}
如果你想要整个记录:
$ awk 'BEGIN{
RS="lease"
FS=" {+|;\n"
}{
n=split($1, a, ".")
last=int(a[n])
if( 3 <= last && last <= 6){
print
}
}' testfile
本awk声明中发生了什么:
- 设置记录分隔符值:
RS="lease"。
- 设置字段分隔符值以查找
{空格或;\n:FS=" {+|;\n"。
- 分割的第一个字段的每个记录在任何
.,存储所得数组中a,存储的长度a中n。
- 存储
ain 的最后一个元素last。
- 测试if
last是否等于或小于我们的最小值(2)或者如果last等于或大于我们的最小值(6),如果是,则打印整个记录。
结果:
192.23.253.3 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
192.23.253.4 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
192.23.253.5 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
}
192.23.253.6 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:01;
uid 00:00:00:00:00:01;
client-hostname "examle-workstation2";
}
如果只需要IP地址:
$ awk 'BEGIN{
RS="lease"
FS=" {+|;\n"
}{
n=split($1, a, ".")
last=int(a[n])
if( 3 <= last && last <= 6){
ip=gensub(/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/,"\\1","", $1)
print ip
}
}' testfile
本awk声明中发生了什么:
- 设置记录分隔符值:
RS="lease"。
- 设置字段分隔符值以查找
{空格或;\n:FS=" {+|;\n"。
- 分割的第一个字段的每个记录在任何
.,在存储所产生的阵列a,存储的长度a中n。
- 存储
ain 的最后一个元素last。
- 测试if
last是否等于或小于我们的最小值(2)或者如果last等于或大于我们的最小值(6),如果这是真的,使用该gensub方法使用正则表达式模式除去IP地址以外的所有内容。
结果:
192.23.253.3
192.23.253.4
192.23.253.5
192.23.253.6