3

我有一个文件,其中包含以下格式的 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.txt,或者home/me/dir1/dir2/filename.txt

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

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

4

4 回答 4

4

AWK 可以这样做:

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

您可以在这里看到它的实际效果

于 2012-12-21T11:40:05.957 回答
3

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

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

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

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

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

awk 'gsub(/^.{47}|\//,"/")==3' file
于 2012-12-21T17:35:14.707 回答
1

这可能对您有用(GNU sed):

sed -rn 's|^([^ ]* *){5}(([^/]*/){2}[^/]*)$|\2|p' file
于 2012-12-22T11:55:01.580 回答