繁体   English   中英

使用 bash 脚本从日志文件中提取所有 JavaScript 文件名

[英]Extracting all JavaScript filenames from a log file using bash script

我有 4 个不同的命名log文件,都带有txt扩展名。 我需要编写一个bash脚本文件,从这些log文件中提取 JavaScript 文件名,无论它们的名称如何。 脚本的 output应该包含路径,必须是唯一的,并且排序

经过一番研究,我想出了这个:

cat logfile1.txt | grep '[^.(]*\.js' | awk -F " " '{print $7}' | sort | uniq -c| sort -nr

这段代码只能完成这项工作;

  • PRO:它确实提取任何 JS,对其进行sorts ,并给出unique结果。
  • CON:我在 file.sh 中需要这个,而不是现在的命令行。 另外,我正在获取 JS 文件的完整路径。 我只需要文件名jquery.js

我尝试添加grep -v "*/name-of-path-before-JS"以阻止结果为我提供完整路径,但这不起作用。

我发现有人使用 python 做了类似的事情; 资源

filenames = set()

with open(r"/home/filelog.txt") as f:
    for line in f:
        end = line.rfind(".js") + 3 # 3 = len(".js")
        start = line.rfind("/", 0, end) + 1 # 1 = len("/")
        filename = line[start:end]
        if filename.endswith(".js"):
            filenames.add(filename)


for filename in sorted(filenames, key=str.lower):
    print(filename)

虽然在给出output时缺少sortuniq选项,但它确实通过仅输出filename.js而不是整个路径作为我制作的命令行来给出结果。 此外,我在运行脚本时添加了log.txt文件的路径,而不是像下面的 python 脚本那样附加它。

例子; $ ./LogReaderScript.sh File-log.txt

确实不需要脚本,因为您可以使用 oneliner 完成工作,因为您已经提到您有多个日志文件要解析,我假设这是您定期执行的任务。

在这种情况下,只需在.bashrc文件中使用这个 oneliner 定义一个别名:

cat $1 | awk '{print $7}' | grep '.js' | awk -F\/ '{print $NF}' | sort | uniq

假设您已经创建了别名parser ,那么您只需要调用parser /path/to/logfile.log

使用上面提供的示例日志文件,output 是:

➜  ~ cat logfile.txt | awk '{print $7}' | grep '.js' | awk -F\/ '{print $NF}' | sort | uniq
jquery.js
jquery.jshowoff.min.js
jshowoff.css

解释:

  • cat用于解析文件,然后将 pipe 的内容放入..
  • awk从文件中提取第 7 个空格分隔字段,因为这些是 apache 访问日志并且您正在搜索请求的文件,第七个字段是您需要的
  • grep仅提取 javascript 文件,即。 那些以.js扩展名结尾的
  • awk再次用于仅打印文件名,这次我们使用-F标志定义自定义字段分隔符,并使用$NF参数执行print命令,该参数指示awk仅打印最后一个字段
  • sortuniq是不言自明的,我们对 output 进行排序,然后只打印每个重复值的第一次出现。

jquery.jshowoff.min.js对我来说看起来像是假的,我怀疑我的命令有问题,但它是日志文件中的实际行 (280)

75.75.112.64 - - [21/Apr/2013:17:32:23 -0700] "GET /include/jquery.jshowoff.min.js HTTP/1.1" 200 2553 "http://random-site.com/" "Mozilla/5.0 (iPod; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25" "random-site.com"

请您尝试 shell 脚本LogReaderScript.sh

#!/bin/bash

if [[ $# -eq 0 ]]; then                 # if no filenames are given
    echo "usage: $0 logfile .."         # then show the usage and abort
    exit 1
fi

grep -hoE "[^/]+\.js" "$@" | sort | uniq -c | sort -nr

通过使用chmod +x LogReaderScript.sh将文件设置为可执行文件,您可以调用:

./LogReaderScript.sh File-log.txt

如果你想一次处理多个文件,你也可以这样说:

./LogReaderScript.sh *.txt
  • grep 的-o选项告诉grep仅打印匹配的子字符串,而不是打印匹配的行。
  • -E选项extended regex指定为一个字符。
  • 如果给出多个文件, -h选项会抑制 output 上的前缀文件名。
  • 模式(正则表达式) [^/]+\.js匹配除斜杠之外的任何字符序列,后跟扩展名.js 它将匹配目标文件名。
  • "$@"扩展为作为 arguments 传递给脚本的文件名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM