[英]Splitting and looping over live command output in Bash
我正在存檔並使用split
生成了多個部分,同時還打印了輸出文件(來自STDERR上的split
,我將其重定向到STDOUT)。 但是,直到命令返回后,才對輸出數據進行循環。
無論如何,在返回命令之前,是否有必要主動分割STDOUT輸出?
以下是我當前擁有的內容,但是僅在命令返回后才顯示文件名列表:
export IFS=$'\n'
for line in `data_producing_command | split -d -b $CHUNK_SIZE --verbose - $ARCHIVE_PREFIX 2>&1`; do
FILENAME=`echo $line | awk '{ print $3 }'`
echo " - $FILENAME"
done
嘗試這個:
data_producing_command | split -d -b $CHUNK_SIZE --verbose - $ARCHIVE_PREFIX 2>&1 | while read -r line
do
FILENAME=`echo $line | awk '{ print $3 }'`
echo " - $FILENAME"
done
但是請注意, while
循環中設置的任何變量在循環之后都不會保留其值( while
循環在子shell中運行)。
沒有理由進行for循環或讀取或回顯。 只需將流通過管道傳輸到awk:
... | split -d -b $CHUNK_SIZE --verbose - test 2>&1 |
awk '{printf " - %s\n", $3 }'
您將會看到緩沖的一些延遲,但是除非您的系統非常慢或者您的感知能力很強,否則您不太可能注意到它。
在開始for
循環之前,命令替換需要運行1 。
for item in $(command which produces items); do ...
而while read -r
可以在產生第一行后立即開始消耗輸出(或更實際地,在輸出緩沖區已滿時開始):
command which produces items |
while read -r item; do ...
1好吧,我認為從設計的角度來看並不是絕對必要的 ,但這就是目前的工作方式。
正如William Pursell已經指出的那樣,沒有必要在while read
循環內運行Awk,因為Awk實際上確實做得很好。
command which produces items |
awk '{ print " - " $3 }'
當然,通過最近合理的GNU Coreutils split
,您可以簡單地執行
split --filter='printf " - %s\n" "$FILE"'; cat >"$FILE" ... options
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.