繁体   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