![从 Linux 上的日志文件中取出某些行](https://linux22.com/image/1210685/%E4%BB%8E%20Linux%20%E4%B8%8A%E7%9A%84%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E4%B8%AD%E5%8F%96%E5%87%BA%E6%9F%90%E4%BA%9B%E8%A1%8C.png)
我当前结构中有日志文件:
标准日期 #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 和类似的程序并不那么熟悉,所以这是我能想到的最好的办法。