gpt4 book ai didi

linux - 如何从实时日志中提取数据并将其传输到 postgres

转载 作者:太空宇宙 更新时间:2023-11-04 05:19:20 25 4
gpt4 key购买 nike

我需要 awk/grep/sed 或任何你认为可以完成这项工作的帮助。我有一个日志文件,需要持续监视它,并在写入新行时从新行中获取一些数据。

新行很长且没有结构化,但它们将包含以下模式UserName=SOMEUSRNAME, NetworkDevice=SOMENETWORKDEVICE, Calling-Station-ID=SOMEMACADDRESS

示例:
5 月 15 日 03:59:16 MTN-LAB-ISE-B1 CISE_Passed_Authentications 0000043297 1 0 2017-05-15 03:59:16.979 +00:00 0013123384 5200 注意 通过身份验证:身份验证成功,ConfigVersionId=170,设备 IP 地址=10。 97.31.130、DestinationIPAddress=10.62.56.152、DestinationPort=1812、UserName=abcd\testuser、协议(protocol)=Radius、RequestLatency=313、NetworkDeviceName=SHROCLUSW-WLAN-LAB、用户名=d4d748fefe96、NAS-IP-地址=10.97.31.130、NAS-Port=50005 ,服务类型 = 调用检查,帧 IP 地址 = 10.97.109.64,帧 MTU = 1500,被叫站 ID = 64-E9-50-B6-DE-05,主叫站 ID = D4-D7-48-FE-FE-96,NAS 端口类型 = 以太网,NAS 端口 ID = GigabitEthernet0/5,EAP key 名称 =,

我正在考虑使用 tail -f 来监视日志文件并将其通过管道传输到 grep/sed/awk 以提取所需的数据。我只需要 SOMEUSERNAME、SOMENETWORKDEVICE、SOMMACADDRESS,也不需要模式。

当然,为了使提取完成后变得更加复杂,我需要将其通过管道传输到 postgres。

有人可以给我一些关于如何进行匹配/提取部分以及到 postgres 的管道的提示吗?

最佳答案

这也可以使用 grep/sed 完成,但我个人更喜欢 awk。

我做了这个简短的脚本filter.awk :

{
# find info in line
userName = gensub(/^.*UserName=([^,\r\n]+).*$/, "\\1", 1, $0)
networkDevice = gensub(/^.*NetworkDeviceName=([^,\r\n]+).*$/, "\\1", 1, $0)
callingStationId = gensub(/^.*Calling-Station-ID=([^,\r\n]+).*$/, "\\1", 1, $0)
# print filtered info (if any of patterns matched)
if (userName != "" || networkDevice != "" || callingStationId != "") {
print "INSERT INTO logs (username, networkdevice, calling_station_id) VALUES ('"userName"', '"networkDevice"', '"callingStationId"');"
}
# If "all patterns" is required instead of "any pattern"
# the "||" operators have to be replaced with "&&".
}

我在 cygwin 中的 bash 上使用 GNU awk 对其进行了测试(Windows 10):

$ cat >filter.txt <<EOF
> May 15 03:59:16 MTN-LAB-ISE-B1 CISE_Passed_Authentications 0000043297 1 0 2017-05-15 03:59:16.979 +00:00 0013123384 5200 NOTICE Passed-Authentication: Authentication succeeded, ConfigVersionId=170, Device IP Address=10.97.31.130, DestinationIPAddress=10.62.56.152, DestinationPort=1812, UserName=abcd\testuser, Protocol=Radius, RequestLatency=313, NetworkDeviceName=SHROCLUSW-WLAN-LAB, User-Name=d4d748fefe96, NAS-IP-Address=10.97.31.130, NAS-Port=50005, Service-Type=Call Check, Framed-IP-Address=10.97.109.64, Framed-MTU=1500, Called-Station-ID=64-E9-50-B6-DE-05, Calling-Station-ID=D4-D7-48-FE-FE-96, NAS-Port-Type=Ethernet, NAS-Port-Id=GigabitEthernet0/5, EAP-Key-Name=,
> EOF

$ awk -f filter.awk filter.txt
INSERT INTO logs (username, networkdevice, calling_station_id) VALUES ('abcd\testuser', 'SHROCLUSW-WLAN-LAB', 'D4-D7-48-FE-FE-96');

$

注释:

  1. NetworkDevice=模式似乎对我来说还不够。我将其替换为 NetworkDeviceName= 。 (如果我错了,应该很容易替换它。)

  2. 我不知道如何正确设置 postgres 的输出格式我也不知道提问者的数据库结构。因此,print声明可能需要调整。 (脚本中只有一个 print 语句。)但是, print语句输出到标准输出 channel (您可能已经预料到了)。因此,它可以轻松地通过管道传输到任何其他输入消耗进程中。

  3. 尚不清楚是否要求所有模式必须匹配或(相反)至少一个。
    我实现了“至少一个”。
    要实现“全部”,|| if 中的运算符语句必须替换为 &&运营商。 (脚本中只有一条 if 语句。)

  4. 不幸的是,gensub()函数仅在 GNU awk 中可用。对于非 GNU awk,可以使用 gsub() 完成另一个解决方案。反而。然而,gensub()功能使用起来更加方便。因此,只要没有明确需要非 GNU awk 解决方案,我更喜欢它。

关于linux - 如何从实时日志中提取数据并将其传输到 postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43971880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com