簡體   English   中英

在Bash中拆分和循環實時命令輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM