lua 脚本中grep的替代方案

我有一个文本文件 output.txt (包含符号 | 的 15 列),内容如下:

[66] | alert:n | 3.0 | 10/22/2020-14:45:50.066928 | local_ip | 123.123.123.123 | 美国 | SURICATA STREAM ESTABLISHED SYNACK resend with different ACK
[67] | alert:n | 3.0 | 10/22/2020-14:45:51.096955 | local_ip | 12.12.12.11 | 美国 | SURICATA STREAM ESTABLISHED SYNACK resend with different ACK
[68] | alert:n | 3.0 | 10/22/2020-14:45:53.144942 | 123.123.123.123 | local_ip | 美国 | SURICATA STREAM ESTABLISHED SYNACK resend with different ACK
[69] | alert:n | 3.0 | 10/22/2020-14:45:57.176956 | local_ip | 68.73.203.109 | 美国 | SURICATA STREAM ESTABLISHED SYNACK resend with different ACK
[70] | alert:n | 3.0 | 10/22/2020-14:46:05.240953 | 123.123.123.123 | local_ip | 美国 | SURICATA STREAM ESTABLISHED SYNACK resend with different ACK
[71] | alert:n | 3.0 | 10/22/2020-14:46:21.624979 | local_ip | 68.73.203.109 | 美国 | SURICATA STREAM ESTABLISHED SYNACK resend with different ACK

我知道如何在 bash 脚本中实现这个功能,比如,如果我想要查找出现在第 9 列的特定 IP 123.123.123.123 的总数,可以实现如下:

 #!/bin/bash
ip="123.123.123.123"
report=output.txt
src_ip_count=$(grep "${ip}" "${report}" | awk '{ print $9 }' | grep -v "local_ip" | uniq -c | awk '{ print $1 }')

输出如下:

[root@me lua-output]# ./test.sh
2

那么,如何用 lua 实现同样的代码呢?我知道可以使用 popen 函数,但是否有原生方法在 lua 中实现呢?另外,如果我使用 popen,我还需要将变量 $ip$report 传递到该命令中,这一点我不确定是否可行。

点赞
用户4984564
用户4984564

有很多方法可以实现,真的。假设你是从标准输入读取数据(尽管同样适用于任何你手动打开的文件),你可以像这样做:

local c = 0
for line in io.lines() do -- 如果你有不同的文件,也可以使用 file:lines()
   if line:find("123.123.123.123") -- 只有包含我们关心的 IP 地址的行
      if (true) -- 其他你想要应用的条件
         c = c + 1
      end
   end
end
print(c)

Lua 没有“列”的概念,所以你自己要构建列。你可以使用模式计算空格数,或将字符串拆分为表并索引它。

2020-10-22 07:46:51
用户841677
用户841677

您提到是否可以在 Lua 中在 popen 中使用变量。是的,您可以在 Lua 中使用 grep 命令。

因此,在 Lua 中,您可以执行以下操作:

-- lua script using grep example
ip = "123.123.123.123"
report = output.txt
local cmd = "grep -F " .. ip .. " " .. report .. " | awk '{ print $9 }' | grep -v 'local_ip' | uniq -c | awk '{ print $1 }'"
local handle = io.popen(cmd)
local src_ip_count = handle:read("*a")
print(src_ip_count)
handle:close()

输出:

2
2020-10-24 08:35:36