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