2016-08-30 27 views
1

我想要得到的東西像第二場的基本名稱的文件,並替換替換:如何做第二場基本名稱的文件和行

$ 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沒有手動編輯。

隨着awk或者sed,這就是我目前取得它現在:)

awk -F/ '{print $NF}' myfile-checksum 
sed -i "s|${value}|$(basename $value)|" myfile-checksum 

感謝。

+0

我無法重現所描述的行爲。 'sha512sum'將只打印哈希旁邊的基名,而不是全名 – hek2mgl

+0

@ hek2mgl它在cygwin上使用bash打印完整路徑。 –

+0

@EdMorton因爲你通過了完整的路徑。如果你導航到目錄,並且只用文件的基名稱調用sha256sum,它將只打印基本名稱和散列。 – hek2mgl

回答

2

您可以設置字段分隔到兩個空格和斜線和打印第一和最後一個字段:

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

echo $ checksum | awk -F「| /」'{print $ 1,$ NF}'| tee myfile完美!謝謝:) –

+0

這是一個無用的處理。您只需導航到感興趣的文件夾並從那裏執行'sha512sum'。問題中描述的情況是不可重現的。 – hek2mgl

+0

@Ed Morton其實我添加了另一個版本,這樣我的答案就完成了。謝謝 – fedorqui

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##*/}展開爲沒有路徑的文件名。

+0

其實我傳遞的變量包含全路徑,你是正確的。 –

+0

檢查我的更新。 – hek2mgl

1
$ awk 'sub(".*/",$1" ")' <<< "deb32b1c7122fc750a6742765e0e54a821 /var/lib/jenkins/myjob/myfile" 
deb32b1c7122fc750a6742765e0e54a821 myfile 

對於除包含換行符之外的任何文件名都有效。如果你有這種情況,讓我們知道。

相關問題