linux - 括号和 ips 之间的所有内容都解析失败

标签 linux bash shell parsing awk

试图快速解析几个文件,但似乎无法组合我试图从日志文件中提取的内容。我正在尝试从日志文件中提取日期和 IP 地址并将它们写入新的日志文件。日志文件类似于:

some info[28/Dec/2016:04:05:58 -0700] 192.168.58.98 Some Other random information
--information--[28/Dec/2016:04:05:58 -0700] 192.168.56.10 Some Other random information
192.168.58.1 [28/Dec/2016:04:05:58 -0700]information 192.168.58.0 Some Other random
sometext:192.168.58.2 [28/Dec/2016:04:05:58 -0700] information

并非文件中的每一行都首先包含 IP 地址或日期...尽管日期肯定在括号中。

到目前为止我尝试过的代码是:

cat log_file | awk -vRS="]" -vFS="[" '{print $2]' >> New_Log_File
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" log_file >> New_Log_File

虽然我需要能够同时提取日期或 IP 并将它们写入新日志文件,但它可以很好地提取日期或 IP。如有任何帮助,我们将不胜感激。

最佳答案

这里是 grep -o 结合 awk 来解析你的输出:

grep -iEo '([0-9]+\.){3}[0-9]+|[0-9]{2}/[a-z]{3}/[0-9]{4}(:[0-9]{2}){3} -[0-9]+|$' file |
awk -F '\n' -v RS= '{
for (i=1; i<=NF; i++)
   if ($i ~ /-[0-9]{4}/) dt=$i; else ips = (ips != "" ? ips OFS $i : $i);
   print dt " :: " ips; dt=ips=""
}'

28/Dec/2016:04:05:58 -0700 :: 192.168.58.98
28/Dec/2016:04:05:58 -0700 :: 192.168.56.10
28/Dec/2016:04:05:58 -0700 :: 192.168.58.1 192.168.58.0
28/Dec/2016:04:05:58 -0700 :: 192.168.58.2
  1. 第一个 grep 用于获取所有日期时间戳或 ip 地址
  2. 然后 awk 用于遍历解析的输出并分离日期和 ip 地址。

关于linux - 括号和 ips 之间的所有内容都解析失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41471517/

相关文章:

linux - 将静态库转换为动态链接库的方法

linux - 使用 awk 根据条件打印特定列

bash - 什么递归地扩展到当前目录中的所有文件?

python - 如何从较小的快照创建具有较大磁盘的计算实例?

python - Ansible shell 模块在目标服务器上是否需要 python?

shell - Shell 中的模式匹配

Linux 系统命令无法通过 crontab 在 Perl 脚本中运行

linux - 如何使用sed替换bash中后跟0个或更多空格的命令

linux - 将 IPv6 添加到 domU guest 中

linux - 如何在 Linux 中为电子邮件添加颜色编码?