对括号和ips之间的所有内容进行解析失败

时间:2017-01-04 19:10:26

标签: 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完全正常,尽管我需要能够同时拉两个并将它们写入新的日志文件。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

以下grep -oawk结合使用来解析您的输出:

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地址。