从 Linux 上的日志文件中取出某些行

从 Linux 上的日志文件中取出某些行

我当前结构中有日志文件:

标准日期 #668324
中远海运电力有限公司
- 游客 - 
IP2LOC:不适用
时间:0900
道琼斯指数:1
操作系统:Windows NT 5.1
浏览器:Firefox 3.5
IP:128.64.55.129

我知道 Linux 可能是命令行工具之王,那么是否有诸如“getlines”之类的工具,以便我可以从文本文件中提取行?我需要的行只有“OS”和“浏览器”,我想将它们全部添加到 1 个 txt 文件中以进行绘图。我可以使用什么命令从这个 txt 文件中获取这两行?我的网站上有数千个这样的文件,它们都是用 PHP 创建的,但由于网站现在更大了,我将使用数据库,但我不想让这些文件浪费掉,因为这些信息仍然有用。

答案1

这应该只返回文件中的操作系统和浏览器行:

egrep '(OS|Browser)' filename

如果您有大量日志文件,则可以使用 *

egrep '(OS|Browser)' /path/to/logs/*

您可以将此输出重定向到新的日志文件

egrep '(OS|Browser)' /path/to/logs/* > summary.log

如果你想从每行开头删除OS:和,你可以使用 awkBrowser:

egrep '(OS|Browser)' /path/to/logs/* | awk -F: '{print $2}' > summary.log

答案2

theotherreceive非常好地解释了解决方案。

补充一点,
如果你怀疑OS或者Browser术语可以出现在日志文件文本的其他地方,

egrep '(^OS:|^Browser:)' filename
        -  - -       -   # Note: extra parts for catching your keys better

会帮你检查。
假设这两个词出现在行首,后面跟着' :'字符。
其余内容已在该答案中描述。

答案3

假设您的所有文件都在一个目录下,例如:/var/www/html/logs 及其子目录。假设所有日志文件都以“.log”结尾。假设您希望将合并后的日志保存到 /home/username/combinedlog.txt

有一个名为“find”的 unix 工具,可以在给定的目录树中搜索文件,例如

find /var/www/html/logs -name '*.log' -type f -print

将打印目录 /var/www/html/logs 及其子目录中所有以 '.log' 结尾的文件的名称。

正如前面的答案所示,你可以只获得操作系统“grep 操作系统:|tail -c +4”并且只有浏览器“grep 操作系统:|tail -c +4”。第一个答案还展示了如何使用一个命令的结果进行 for 循环。因此,合并后的答案将是:

for i in `find /var/www/html/logs -name '*.log' -type f -print`; do 
  grep "OS:" $i |tail -c +4 >> /home/username/combinedlog.txt; 
  grep "Browser:" $i|tail -c +9 >> /home/username/combinedlog.txt; 
done;

这将一次性遍历所有文件。请注意,“>>”是附加到文件,如果您再次运行此操作而不删除先前合并的日志文件,您将复制内容!

编辑:或者您可以使用上一个答案中的 egrep + awk,并将两个 grep 替换为一个 egrep + awk。您还可以使用“cut”代替“tail”或“awk”。

答案4

您应该能够使用grep和的魔法能力tail

返回浏览器:

 cat file.txt | grep Browser: | tail -c +9

要返回操作系统:

cat file.txt | grep OS: | tail -c +4

如果您想将它们写入文本文件,可以这样做:

 cat file.txt | grep OS: >> results.txt && cat file.txt | grep Browser: >> results.txt

可能还有其他解决方案,但是我对 Bash 和类似的程序并不那么熟悉,所以这是我能想到的最好的办法。

相关内容