我有一个文件,其中包含以下格式的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来获取文件名。
答案 0 :(得分:4)
AWK可以这样做:
awk '{ orig=$NF ; if (gsub("/","",$NF) == 2) { print orig } }' INPUTFILE
答案 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