Два Onelinner для цикла для списка и grep Bash - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть список файлов со следующей схемой

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

И просто остается там, я думаю, что это тяжело и занимает много времени, и я не могу понять, действительно ли это работает, кто-то может мне помочь?

1 Ответ

0 голосов
/ 19 сентября 2018
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
...