[英]read output log file, and print all unique file paths using bash/python script
[英]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
这段代码只能完成这项工作;
sorts
,并给出unique
结果。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
时缺少sort
和uniq
选项,但它确实通过仅输出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
仅打印最后一个字段sort
和uniq
是不言自明的,我们对 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
-o
选项告诉grep
仅打印匹配的子字符串,而不是打印匹配的行。-E
选项extended regex
指定为一个字符。-h
选项会抑制 output 上的前缀文件名。[^/]+\.js
匹配除斜杠之外的任何字符序列,后跟扩展名.js
。 它将匹配目标文件名。"$@"
扩展为作为 arguments 传递给脚本的文件名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.