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を使ってみましたが、うまくいきませんでした。必要なリストを取得したら、カットを使用してファイル名を取得できることを知っています。

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 に答える