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