这是我的输入文件:
/home/sites/default/files/Maple%20board02%2019%2013%20.pdf
/home/sites/default/files/paintgrade/side-view.jpg
/home/sites/default/files/paintgrade/steps_2.jpg
/home/sites/default/files/Front%20sill-photo1.gif
/home/sites/default/files/Rear%20steps%20Feb.%209.2011.pdf
这是我的grep/awk声明:
grep /files/ 404s.txt | awk -F '/' '{print $6"/"$7}'
该语句的输出是:
Maple%20board02%2019%2013%20.pdf/
paintgrade/side-view.jpg
paintgrade/steps_2.jpg
Front%20sill-photo1.gif/
Rear%20steps%20Feb.%209.2011.pdf/
(看到后面的斜杠了吗?有时它在那里,有时不在。有时没有子目录,我的awk语句也会打印一个"/"。)
我在另一篇帖子中看到了如何删除尾部斜杠,但我不确定如何在这里应用它。帖子说${1%/}
会给你一个没有斜杠的字符串。帖子在这里。投票最高的答案是:target=${1%/}
我想在我的grep/awk语句中添加一些内容,使输出为:
Maple%20board02%2019%2013%20.pdf
paintgrade/side-view.jpg
paintgrade/steps_2.jpg
Front%20sill-photo1.gif
Rear%20steps%20Feb.%209.2011.pdf
我可以在原始语句中添加什么以使输出如上所述?也许cut
会有所帮助,或者我的awk
可以调整为不打印尾随的"/"?
问题是,如果没有$7
,则会出现尾部斜线。这里有一个快速解决方案:
$ grep /files/ 404s.txt | awk -F/ '{s=$6} NF==7 {s=s"/"$7} {print s}'
Maple%20board02%2019%2013%20.pdf
paintgrade/side-view.jpg
paintgrade/steps_2.jpg
Front%20sill-photo1.gif
Rear%20steps%20Feb.%209.2011.pdf
更一般地说,如果存在比paintgrade
更深的目录的可能性,则使用:
$ grep /files/ 404s.txt | awk -F/ '{s=$6; for (i=7;i<=NF;i++) {s=s"/"$i}} {print s}'
此外,不需要单独的grep
过程:
awk -F/ '!//files//{next} {s=$6; for (i=7;i<=NF;i++) {s=s"/"$i}} {print s}' 404s.txt
一个更通用但更简单的解决方案:使用sed
这将替换grep
和awk
命令:
sed -n 's|.*/files/||p' 404s.txt
要删除该前缀,类似这样的操作将起作用(替换掉字符串,然后使用truth-y模式来获得默认打印操作)。
awk '{sub("^/home/sites/default/files/", "")}7'
如果您需要从行的开头删除X个字段,那么使用cut
通常会比使用awk
更简单。
cut -d/ -f6-