欢迎大家来到IT世界,在知识的湖畔探索吧!
最近处理docker registry镜像仓库,需要提取文件和路径,所以大概总结了下shell下提取文件和路径的方式。
欢迎大家来到IT世界,在知识的湖畔探索吧!
示例字符串
strings_link="repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/link" strings_data="blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/data"欢迎大家来到IT世界,在知识的湖畔探索吧!
registry镜像的link路径以及data路径。/docker/registry/v2/。
01 获取文件名
basename命令
CentOS7 shell的软件coreutils提供了basename,从字符串中去除目录,来提取文件名。
欢迎大家来到IT世界,在知识的湖畔探索吧!strings_link="repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/link" strings_data="blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/data" # basename "$strings_link" link # basename "$strings_data" data # realpath "$strings_link" /app/registry/docker/registry/v2/repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/link
basename不会去判断文件或者路径是否真实存在,只是字符串处理,最后一个字符/后的字符串提取。
realpath是提去文件的绝对路径。
awk命令
awk是通过分隔符’/’,提取最后一列数据即为文件名。
strings_link="repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/link" strings_data="blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/data" # echo "$strings_link" |awk -F'/' '{print $NF}' link # echo "$strings_data" |awk -F'/' '{print $NF}' data
NF(The number of fields)为当前输入记录的字段数,即最后一列。
shell ${}处理,${var*/}
${strings_link*/}:去掉变量从左边算起的最后一个/字符及其左边的内容,保留的值是左边从最后一个/(不包含)的右边所有内容。
欢迎大家来到IT世界,在知识的湖畔探索吧!strings_link="repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/link" strings_data="blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/data" # echo ${strings_link*/} link # echo ${strings_data*/} data
#是删除左边最小匹配,删除左边最大匹配;%是删除右边最小匹配,%%删除右边最大匹配;
换句话来说,#总是表示左边算起,%总是表示右边算起。
02 获取路径
dirname命令
CentOS7 shell的软件coreutils提供了dirname,从字符串中去除文件名,来提取目录。
strings_link="repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/link" strings_data="blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/data" # dirname "$strings_link" repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872 # dirname "$strings_data" blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e87
dirname不会去判断文件或者路径是否真实存在,只是字符串处理,最后一个字符/前的字符串提取。
awk命令
awk的分隔符也可以是正则表达式,‘/[^/]*$’或者‘/[^/]+$’是匹配到/link做分隔符,$1即为目录。
欢迎大家来到IT世界,在知识的湖畔探索吧!strings_link="repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/link" strings_data="blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/data" # echo $strings_link |awk -F '/[^/]*$' '{print $1}' repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872 # echo $strings_data |awk -F '/[^/]*$' '{print $1}' blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872
在线正则表达式测试
shell ${}处理,${var%/*}
${strings_link%/*}:去掉从右边起第一个/字符串及其右边的内容,保留从右边起第一个/(不包含)的左边的所有内容。
strings_link="repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/link" strings_data="blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872/data" # echo "${strings_link%/*}" repositories/nginx-hello-lu/_manifests/revisions/sha256/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872 # echo "${strings_data%/*}" blobs/sha256/33/33c0399e4e29c56c0306a4e0a0d047699f5f56da39d72f994a07c535c2b3e872
on my way!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/107610.html