如何用Bash脚本从日志文件中提取纯JavaScript文件名?
问题:从日志文件中提取仅含.js后缀的纯文件名
现有日志文件logfile.txt,需要从中提取仅含.js后缀的纯文件名(如filename.js)。尝试了以下脚本:
for line in $1 do grep -F ".js" $1 | awk '{print $7}' | sort -u done
输出结果接近目标但包含路径及参数:
/blog/wp-includes/js/swfobject.js?ver=2.2 /fla/AC_RunActiveContent.js /include/jquery.js /include/jquery.jshowoff2.js /include/jquery.jshowoff.min.js /include/js/jquery.lightbox-0.5.js /scripts/ac_runactivecontent.js
改用cut命令(cut -d "/" -f5)替换awk后,出现文件名截断问题:
ac_runactivecontent.js HTTP AC_RunActiveContent.js HTTP jquery.jshowoff2.js HTTP jquery.jshowoff.min.js HTTP jquery.js HTTP js wp-includes
期望得到如下纯文件名:
swfobject.js AC_RunActiveContent.js jquery.js jquery.jshowoff2.js jquery.jshowoff.min.js jquery.lightbox-0.5.js ac_runactivecontent.js
解决方案
方法1:用awk一次性完成处理
利用awk的字符串处理能力,直接提取目标字段并清理路径、参数:
awk '/\.js/ { split($7, path_parts, "/"); fname = path_parts[length(path_parts)]; sub(/\?.*/, "", fname); print fname }' logfile.txt | sort -u
/\.js/:只筛选包含.js的行split($7, path_parts, "/"):把第7个字段按/分割成数组,拆分路径层级path_parts[length(path_parts)]:取数组最后一个元素,即带参数的文件名sub(/\?.*/, "", fname):移除?及后面的所有参数sort -u:去重并按序排列结果
方法2:结合grep+sed链式处理
先过滤目标行、提取字段,再用sed正则清理路径和参数:
grep -F ".js" logfile.txt | awk '{print $7}' | sed -E 's/.*\/([^/?]+)\?.*/\1/; s/.*\/([^/]+)/\1/' | sort -u
sed -E 's/.*\/([^/?]+)\?.*/\1/':匹配带参数的路径,提取/和?之间的纯文件名s/.*\/([^/]+)/\1/:处理不带参数的路径,提取最后一个/后的文件名
方法3:用basename+cut组合处理
借助basename去掉路径,再用cut截断参数:
grep -F ".js" logfile.txt | awk '{print $7}' | while read line; do basename "$line" | cut -d "?" -f1; done | sort -u
basename "$line":直接移除所有路径前缀,保留文件名(含参数)cut -d "?" -f1:以?为分隔符,取第一个字段,即去掉参数部分
内容的提问来源于stack exchange,提问作者Arturo Rubio
相关产品推荐
相关产品推荐

