[英]How to extract filename from path using sed or 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
我在sed嘗試過類似的東西:
的:* / ::“
然而,它太貪婪了,它吃掉了我的其余部分。 我一直在瀏覽帖子,但到目前為止還沒有運氣。 任何提示?
當僅需要從給定的絕對路徑中提取文件名時,所給出的答案似乎都不完全正確。 因此我在這里給出解決方案。 讓我們考慮在變量filename中我們有完整的路徑,例如, filename = / ABC / DEF / GHI那么,
echo $filename | awk 'BEGIN{FS="/"}{print $NF}'
將導致文件名GHI 。
只要你告訴它不要太貪心你就可以很容易地用sed做到這一點:
% echo '/img/pictos/klArrowRight.gif 03/Dec/2012' | sed 's,^[^ ]*/,,'
klArrowRight.gif 03/Dec/2012
%
(也就是說,“從行的開頭開始,找到最長的非空格字符列表,后跟斜杠”)
您的問題中的輸入/輸出格式不正確。 你需要這個嗎?
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
使用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
awk 'BEGIN{FS=OFS="\t"} {sub(/.*\//,"",$1)} 1' file
使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.