查找包含两个正斜杠的文件

时间:2012-12-21 11:33:55

标签: linux sed awk grep

我有一个文件,其中包含以下格式的tar存档的输出:

-rw-r--r-- me/users       362 2011-03-01 18:23 home/me/de/bin/aur/jdk/pkg/opt/java/lib/visualvm/platform/update_tracking/org-openide-awt.xml

我想要输出的只是文件名,只有包含2个斜杠的文件名,即home/me/filename.txt

我不想home/me/dir1/filename.txthome/me/dir1/dir2/filename.txt

我遇到了困难,因为存档中的每个文件都以home/me/

开头

到目前为止,我一直在尝试使用grep和awk,但没有运气。我知道一旦得到我想要的列表,我就可以使用cut来获取文件名。

4 个答案:

答案 0 :(得分:4)

AWK可以这样做:

 awk '{ orig=$NF ; if (gsub("/","",$NF) == 2) { print orig  } }' INPUTFILE

你可以see it in action here

答案 1 :(得分:3)

我假设每一行都是相同的固定宽度格式,所以

shopt -s extglob
while IFS= read -r line; do
    if [[ "${line:47}" == +([^/])/+([^/])/+([^/]) ]]; then
        # has 2 slashes
        echo "${line:47}"
    fi
done < filename

答案 2 :(得分:2)

@glennjackman给了我一个强大的awk解决方案的想法,如果文件名包含空格(并出现在固定位置),它将起作用:

awk -F'^.{47}' 'gsub(/\//,"&",$2)==2{print $2}' file

如果您不介意在文件路径的前面添加额外的“/”,您可以缩写为:

awk 'gsub(/^.{47}|\//,"/")==3' file

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -rn 's|^([^ ]* *){5}(([^/]*/){2}[^/]*)$|\2|p' file