我试图在文件中获取第二个字段的basename之类的东西并替换它:
$ myfile=/var/lib/jenkins/myjob/myfile
$ sha512sum "$myfile" | tee myfile-checksum
$ cat myfile-checksum
deb32b1c7122fc750a6742765e0e54a821 /var/lib/jenkins/myjob/myfile
期望的输出:
deb32b1c7122fc750a6742765e0e54a821 myfile
因此,人们可以轻松地sha512sum -c myfile-checksum
进行手动编辑。
使用sed或awk,这就是我现在的目标:)
awk -F/ '{print $NF}' myfile-checksum
sed -i "s|${value}|$(basename $value)|" myfile-checksum
感谢。
答案 0 :(得分:3)
您可以将字段分隔符设置为空格和斜杠,并打印第一个和最后一个字段:
awk -F" |/" '{print $1, $NF}'
输入您的信息:
$ awk -F" |/" '{print $1, $NF}' <<< "deb32b1c7122fc750a6742765e0e54a821 /var/lib/jenkins/myjob/myfile"
deb32b1c7122fc750a6742765e0e54a821 myfile
如果你的文件名包含空格,请删除从第一个字段到最后一个斜线的所有内容,如Ed Morton所示:
$ awk '{hash=$1; gsub(/^.*\//,""); print hash, $0}' <<< "deb32b1c7122fc750a6742765e0e54a821 /var/lib/jenkins/myjob/myfile with spaces"
deb32b1c7122fc750a6742765e0e54a821 myfile with spaces
答案 1 :(得分:1)
sha512sum
将只使用您传递给它的文件名 - 未更改。
如果你通过
sha512sum /path/to/file
它会给你:
123456.. /path/to/file
但如果你:
pushd /path/to
sha512sum file
popd
它会给你
123456.. file
如果文件名是变量,您可以使用parameter expansion,如下所示:
pushd "${file%/*}"
sha256sum "${file##*/}"
popd
甚至
# cd will not change the PWD of the current shell since
# the command runs in a sub shell
(cd "${file%/*}"; sha256sum "${file##*/}")
如果$file
包含文件名,${file%/*}
会扩展到没有文件名的路径,而${file##*/}
会扩展为没有路径的文件名。
答案 2 :(得分:1)
$ awk 'sub(".*/",$1" ")' <<< "deb32b1c7122fc750a6742765e0e54a821 /var/lib/jenkins/myjob/myfile"
deb32b1c7122fc750a6742765e0e54a821 myfile
除了包含换行符的文件名之外,它将适用于任何文件名。如果您有这种情况,请告诉我们。