Bash

將單個輸出行保存到變數中

  • April 5, 2019

find -mtime -2用來查找在過去 24 小時或更短時間內修改過的文件。輸出看起來像這樣。

/home/user/logs/file-2014-08-22.log
/home/user/logs/file-2014-08-23.log

我需要將輸出的第一行保存到一個變數中,然後將第二行保存到一個單獨的變數中。我不能只是管它。我知道您可能會建議| grep 22,或者23但這是將執行多次的 bash 腳本的一部分,下次會有一組不同名稱的不同文件,因此grep過於具體。能awk做到這一點嗎?如果是這樣,怎麼做?.

假設您的任何文件名中都沒有空格等,有幾種方法可以做到這一點。一種是使用數組:

files=( $(find -mtime -2) )
a=${files[1]}
b=${files[2]}

files將是按順序輸出的所有路徑的數組,find從零開始索引。你可以從中得到任何你想要的行。這裡我將第二行和第三行保存到aandb中,但您也可以直接使用數組元素。

如果您有 GNU find 或其他printf選項,則另一種方法是將其與read處理替換結合使用:

read junk a b junk < <(find -printf '%p ')

這將所有find的輸出轉換為一行,然後將該行作為輸入提供給read,這將第一個單詞(路徑)保存到junk,第二個到a中,第三個到b,並將該行的其餘部分junk再次保存到。

同樣,您可以在任何 POSIX 兼容系統上引入相同效果的paste命令:

read junk a b junk < <(find -mtime -2 | paste -s)

paste -s將其輸入轉換為單個製表符分隔的行,read可以再次處理。

在一般情況下,如果您樂於多次執行主命令(這裡沒有必要),您可以sed輕鬆使用:

find | sed -n 2p

這將只列印輸出的第二行,通過抑制普通輸出-n並選擇要列印的第 2 行p。您還可以拼接在一起headtail獲得相同的效果,這在非常長的文件中可能會更有效。

以上所有內容都具有將第二行和第三行儲存到aand中的相同效果b,並且都仍然假設在輸入欄位分隔符 ( IFS)值中沒有空格、製表符、換行符或任何其他字元在任何文件名中。


請注意,雖然 的輸出順序find是未定義的,但“第二個文件”並不是真正有用的標識符,除非您將它們組織為以其他方式排序。在許多情況下,它可能接近於創建順序,但不是全部。

引用自:https://unix.stackexchange.com/questions/152003