簡體   English   中英

兩個Onelinner For Cycle用於列表和grep Bash

[英]Two Onelinner For Cycle for list and grep Bash

我有一個具有以下架構的文件列表

YYYYMMDD.tar.gz

我想zcat到他們每個人(我沒有zgrep),然后像這樣grep每個人

grep --color=always "STRING" | grep 29000000.00 | grep --color=always string

對於zcat,以下代碼可以正常工作:

for archivos in $(ls -ltrh 2017091*.tar.gz); do zcat $archivos ; done

如果我嵌套兩個周期:

for archivos in $(ls -ltrh 2017091*.tar.gz)
do 
    for subarchivos in $(zcat $archivos)
    do 
        grep --color=always 29000000.00
    done
done

我得到

gzip: invalid option -- 'w'
Try `gzip --help' for more information.
gzip: 1.gz: No such file or directory
gzip: file.gz: No such file or directory
gzip: file.gz: No such file or directory
gzip: 357M.gz: No such file or directory
gzip: file3.gz: No such file or directory
gzip: 11.gz: No such file or directory
gzip: 00:00.gz: No such file or directory

只是呆在那里,我覺得很沉重,要花很多時間,我看不出它是否真的有效,有人可以幫我嗎?

 for archivos in $(ls -ltrh 2017091*.tar.gz); do zcat $archivos ; done 

如果要解析ls的輸出,則需要省略所有這些標志。 您只希望它打印文件名,而不打印大小和權限等。 擺脫-ltrh

除了,實際上, 您不應該解析ls的輸出。 相反,只需將所有文件名傳遞給zcat。

zcat 2017091*.tar.gz

如果我嵌套兩個周期:

 for archivos in $(ls -ltrh 2017091*.tar.gz) do for subarchivos in $(zcat $archivos) do grep --color=always 29000000.00 done done 

您不想重復運行grep 相反,您要運行一系列zcat ,並將它們的輸出通過管道傳遞到grep。 為此,您需要將整個for循環傳遞給grep

for archivos in $(ls -ltrh 2017091*.tar.gz)
do
    zcat "$archivos"
done | grep --color=always 29000000.00

然后如上所述,您根本不需要for循環。

zcat 2017091*.tar.gz | grep --color=always 29000000.00

對於它的價值,我不建議使用--color=always 如果將腳本的輸出傳遞給更多命令以進行進一步處理,則顏色代碼會使事情搞砸。 --color=auto更好。

zcat 2017091*.tar.gz | grep --color=auto 29000000.00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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