1

我有一个要解析的日志文件

我只需要前两个字段(以空格分隔)

日志文件中的示例行:

1362960460.697 19 27.197.12.76 TCP_MISS/404 339 GET http://what-ever-server.com/what-ever-file - DIRECT/22.22.22.22 text/html

第一个字段应该没有“。”之后的数字。

我以为我可以用 C 来做到这一点,但是如果有一个指针来跟踪每个字符以检查它是空格还是“。”,那就太复杂了。所以我在这里的一些帖子中看到 grep 可以完成这项工作,但我文件中的字段没有固定长度

我应该在C中做吗?或者 grep 中是否有一个选项可以让我解析

提前致谢

4

4 回答 4

4

这就是 awk 的用途。

cat logfile | awk '{print $1 " " $2}' | sed 's_\.[0-9]*__g'

您使用 打印每行的第一个和第二个字段awk。然后匹配小数位并使用sed.

于 2013-03-23T10:55:15.093 回答
4

获取文件使用的前 2 个字段awk(包含在所有 unix 或 linux 发行版中)

awk '{split($1,a,"."); print a[1], $2}' logfile

解释:

  • split函数根据分隔符将第一个标记 ( $1) 拆分为数组a.
  • print a[1], $2根据输出字段分隔符打印两个值,默认情况下是空格

一种更简单的方法(假设第一个字段是数字)是使用int函数:

 awk '{print int($1), $2}' logfile
于 2013-03-23T10:58:16.217 回答
4
$ cat file
1362960460.697 19 27.197.12.76 TCP_MISS/404 339 GET http://what-ever-server.com/what-ever-file - DIR
ECT/22.22.22.22 text/html

$ awk -F'[ .]' '{print $1,$3}' file
1362960460 19

$ sed 's/\([^.]\)\.[^ ]* \([^ ]*\).*/\1 \2/' file
1362960460 19
于 2013-03-23T13:20:33.937 回答
0

BSD 版本(即 OSX)

cat logfile | awk '{print $1, $2}' | sed -e 's;\.*;;g'
于 2013-03-23T11:01:41.120 回答