如何在文件中的第二个字段上执行basename并将其替换为行

时间:2016-08-30 14:34:14

标签: bash awk sed

我试图在文件中获取第二个字段的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

感谢。

3 个答案:

答案 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

除了包含换行符的文件名之外,它将适用于任何文件名。如果您有这种情况,请告诉我们。