如何使用sed或awk从路径中提取文件名

时间:2012-12-07 15:45:45

标签: linux unix sed awk

我正在尝试从已修改的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

我在中尝试过类似的内容:

  

的:* / ::'

然而,它太贪心了,它吃掉了我的剩余部分。我一直在浏览帖子,但到目前为止还没有运气。任何提示?

6 个答案:

答案 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