將單個輸出行保存到變數中
我
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
從零開始索引。你可以從中得到任何你想要的行。這裡我將第二行和第三行保存到a
andb
中,但您也可以直接使用數組元素。如果您有 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
。您還可以拼接在一起head
並tail
獲得相同的效果,這在非常長的文件中可能會更有效。以上所有內容都具有將第二行和第三行儲存到
a
and中的相同效果b
,並且都仍然假設在輸入欄位分隔符 (IFS
)值中沒有空格、製表符、換行符或任何其他字元在任何文件名中。請注意,雖然 的輸出順序
find
是未定義的,但“第二個文件”並不是真正有用的標識符,除非您將它們組織為以其他方式排序。在許多情況下,它可能接近於創建順序,但不是全部。