我正在尝试从已修改的apache web访问日志条目中解析文件名:
/common/common/img/pictos/klArrowRight.gif /common/common/img/pictos/klArrowRight.gif 03/Dec/2012:00:00:00 127.0.0.1 03/Dec/2012:00:00:00 us 404
我希望它能像这样出现:
klArrowRight.gif /common/common/img/pictos/klArrowRight.gif 03/Dec/2012:00:00:00 127.0.0.1 03/Dec/2012:00:00:00 us 404
我在sed中尝试过类似的内容:
的:* / ::'
然而,它太贪心了,它吃掉了我的剩余部分。我一直在浏览帖子,但到目前为止还没有运气。任何提示?
答案 0 :(得分:6)
当只需要从给定的绝对路径中提取文件名时,没有给出的答案看起来完全正确。因此我在这里给出解决方案。 让我们考虑在变量 filename 中我们有完整的路径,例如 filename = / ABC / DEF / GHI 然后,
echo $filename | awk 'BEGIN{FS="/"}{print $NF}'
将生成文件名 GHI 。
答案 1 :(得分:4)
只要你告诉它不要太贪心,你就可以很容易地用sed做到这一点:
% echo '/img/pictos/klArrowRight.gif 03/Dec/2012' | sed 's,^[^ ]*/,,'
klArrowRight.gif 03/Dec/2012
%
(即"从该行的开头开始,找到最长的非空格字符列表,后跟斜杠")
答案 2 :(得分:2)
您问题中的输入/输出格式不正确。你需要这个吗?
awk '{gsub(/\/.*\//,"",$1); print}' file
测试
kent$ echo "/common/common/img/pictos/klArrowRight.gif /common/common/img/pictos/klArrowRight.gif 03/Dec/2012:00:00:00 127.0.0.1 03/Dec/2012:00:00:00 us 404"|awk '{gsub(/\/.*\//,"",$1); print}'
输出:
klArrowRight.gif /common/common/img/pictos/klArrowRight.gif 03/Dec/2012:00:00:00 127.0.0.1 03/Dec/2012:00:00:00 us 404
答案 3 :(得分:2)
使用perl regexp和basename(我不认为你坚持使用sed / awk):
perl -p -e 'use File::Basename;s/([^\s]+\s+)[^\s]+\s+/$1/;print basename($1)'
示例:
echo "/common/common/img/pictos/klArrowRight.gif /common/common/img/pictos/klArrowRight.gif 03/Dec/2012:00:00:00 127.0.0.1 03/Dec/2012:00:00:00 us 404" |
perl -p -e 'use File::Basename;s/([^\s]+\s+)[^\s]+\s+/$1/;print basename($1)'
klArrowRight.gif /common/common/img/pictos/klArrowRight.gif 03/Dec/2012:00:00:00 127.0.0.1 03/Dec/2012:00:00:00 us 404
答案 4 :(得分:1)
awk 'BEGIN{FS=OFS="\t"} {sub(/.*\//,"",$1)} 1' file
答案 5 :(得分:0)
使用GNU grep
的一种方式:
grep -oP "[^/]*\t.*" file
结果:
klArrowRight.gif /common/common/img/pictos/klArrowRight.gif 03/Dec/2012:00:00:00 127.0.0.1 03/Dec/2012:00:00:00 us 404