4

我正在尝试从以制表符分隔的修改后的 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

我在尝试过这样的事情:

's:.*/::'

但是,它太贪婪了,它吃掉了我的其余部分。我一直在看帖子,但到目前为止还没有运气。有什么提示吗?

4

6 回答 6

8

当只需要从给定的绝对路径中提取文件名时,给定的答案似乎都不完全正确。因此,我在这里给出解决方案。让我们考虑在变量文件名中我们有完整的路径,例如filename=/ABC/DEF/GHI 然后,

echo $filename | awk 'BEGIN{FS="/"}{print $NF}'

将产生文件名GHI

于 2014-02-14T21:04:13.917 回答
4

只要你告诉它不要太贪心,你就可以很容易地用 sed 做到这一点:

% echo '/img/pictos/klArrowRight.gif 03/Dec/2012' | sed 's,^[^ ]*/,,'
klArrowRight.gif 03/Dec/2012
%

(即“从行首开始,查找最长可能的非空格字符列表,后跟斜杠”)

于 2012-12-07T16:17:37.260 回答
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
于 2012-12-07T15:56:37.423 回答
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
于 2012-12-07T15:54:31.553 回答
1
awk 'BEGIN{FS=OFS="\t"} {sub(/.*\//,"",$1)} 1' file
于 2012-12-07T16:01:46.817 回答
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
于 2012-12-08T12:05:40.213 回答