按特定列对日志文件进行排序对于快速查找信息很有用。日志一般以明文方式储存,因而您可以使用命令行文本操作工具对其进行处理并以更易读的形式查看它们。
使用cut和awk提取列
cut和awk实用程序是从文本文件中提取信息列的两种不同方式。二者都假定您的日志文件是用空格分隔的,比如:
column column column
假如列中的数据包含空格,比如日期(“WedJun12”),则会出现问题。其实cut可能会将其视为三个单独的列,但您一直可以同时提取所有这三个列,前提是您的日志文件的结构是一致的。
cut使用上去十分简单:
cat system.log | cut -d ' ' -f 1-6
cat命令读取system.log的内容并将其通过管线传输到cut。-d标志指定分隔符,在本例中为空格。(默认为制表符linux mint,t。)-f标志指定要输出的数组。此命令专门用于复印system.log的前六列。倘若您只想复印第三列,则可以使用-f3标志。
awk功能更强悍但不够简约。cut可用于提取列,比如,假若您想从Apache日志中获取IP地址列表。awk可以重新排列整行,这对于按特定列对整个文档进行排序很有用。awk是一种完整的编程语言,但您可以使用一个简单的命令来复印列:
cat system.log | awk '{print $1, $2}'
awk为文件中的每一行运行您的命令。默认情况下,它按空格分拆文件并将每一列储存在变量$1、$2、$3等中。通过使用print$1命令,您可以复印第一列,但不使用循环就难以轻松复印一系列列。
awk的一个用处是该命令可以一次引用整行。该行的内容储存在变量$0中,您可以使用它来复印整行。为此,比如,您可以在复印该行的其余部份之前复印第三列:
awk '{print $3 " " $0}'
\在$3和$0之间复印一个空格。此命令重复第三列两次,但您可以通过将$3变量设置为null来解决此问题:
awk '{printf $3; $3=""; print " " $0}'
printf命令不会复印新行。同样,您可以通过在复印$0之前将它们全部设置为空字符串来从输出中排除特定列:
awk '{$1=$2=$3=""; print $0}'
您可以使用awk做更多事情,包括正则表达式匹配,但开箱即用的列提取特别适宜此用例。
使用sort和uniq对列进行排序
sort命令可用于按照特定列对数据列表进行排序。句型是:
sort -k 1
其中-k标志表示列号。您通过管线将输入输入此命令,它会吐出一个有序列表。默认情况下,sort使用字母次序,但通过标志支持更多选项,比如-n用于数字排序linux 文件按时间排序,-h用于后缀排序(1M>1K),-M用于对月份简写进行排序,-V用于对文件版本号进行排序(file-1.2.3>file-1.2.1)。
uniq命令过滤掉重复的行,只留下惟一的行。它仅适用于相邻行(出于性能缘由),因而您须要一直在sort以后使用它来删掉整个文件中的重复项。句型很简单:
sort -k 1 | uniq
倘若您只想列举重复项,请使用-d标志。
uniq还可以使用-c标志估算重复项的数目,这促使它特别适宜跟踪频度。诸如,倘若您想获得访问Apache服务器的排行靠前的IP地址列表,您可以在access.log上运行以下命令:
cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head
这串命令将删掉IP地址列,将重复项组合在一起,在估算每次出现的同时删掉重复项,之后按照计数列按数字升序排序,留下一个如下所示的列表:
21 192.168.1.1 12 10.0.0.1 5 1.1.1.1 2 8.0.0.8
不仅awk和sed等其他实用程序之外,您还可以将这种相同的技术应用于日志文件,以提取有用的信息。这种链式命令很长,但您何必每次都输入它们,由于您仍然可以将它们储存在bash脚本中或通过~/.bashrc为它们设置别称。
使用grep和awk过滤数据
grep是一个极其简单的命令;你给它一个搜索词并传递给它输入,它会吐出包含该搜索词的每一行。诸如,假若您想在Apache访问日志中搜索404错误雨林木风linux,您可以这样做:
cat access.log | grep "404"
这将吐出与给定文本匹配的日志条目列表。
然而,grep未能将其搜索限制在特定列,因而假如文件中的其他任何位置都有文本“404”,此命令将失败。假如只想搜索HTTP状态代码列,则须要使用awk:
cat access.log | awk '{if ($9 == "404") print $0;}'
使用awk,您还可以进行否定搜索。诸如,您可以搜索所有没有返回状态代码为200(正常)的日志条目:
cat access.log | awk '{if ($9 != "200") print $0;}'
以及访问awk提供的所有编程功能。
Web日志的GUI选项
GoAccess是一个CLI实用程序,用于实时监控Web服务器的访问日志linux 文件按时间排序,并按每位有用的数组进行排序。它完全在您的终端中运行,因而您可以通过SSH使用它,但它还有一个更直观的Web界面。
apachetop是另一个专门用于apache的实用程序,可用于按访问日志中的列进行过滤和排序。它直接在您的access.log上实时运行。