You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:09:21