Сценарий Bash - выполнить grep для имен файлов, содержащих определенные числа [дубликаты]

avatar
Asy
8 апреля 2018 в 03:19
65
1
1

У меня есть куча файлов, таких как:

jobReports/NARX_20191212_1.out
jobReports/NARX_20191212_10.out
jobReports/NARX_20197695_2.out
jobReports/NARX_20197695_3.out
jobReports/NARX_20261798_1.out

где первая последовательность цифр обозначает идентификатор задания, а вторая последовательность цифр обозначает идентификатор массива.

Я хочу выполнить поиск по всем файлам .out в этом каталоге с идентификатором задания, равным 20197695 или 20261798.

В командной строке это работает:

grep "Saving results to" jobReports/NARX_{20197695,20261798}*.out | wc -l

, что дает мне количество вхождений этой строки в нужных файлах. В моем сценарии у меня есть следующее:

#!/bin/bash
myJobs = ( 20197695, 20261798 )
IFS=, eval 'myJobs_string="${myJobs[*]}"'
echo $(grep "Saving results to" jobReports/NARX_{$myJobs_string}*.out |wc -l)

при запуске я получаю сообщение об ошибке:

grep: jobReports/NARX_{: No such file or directory
grep: 20197695: No such file or directory
grep: }*.out: No such file or directory

Похоже, внутри скрипта расширение фигурной скобки работает не так, как я ожидал... что я могу сделать, чтобы исправить это?

Источник
kyodev
8 апреля 2018 в 04:04
0

почему эвал? почему бы и нет jobReports/NARX_{${myJobs[@]}}*.out

kyodev
8 апреля 2018 в 04:10
0

почему myJobs — это массив, а не простая переменная «{20197695, 20261798}»

David C. Rankin
8 апреля 2018 в 10:46
0

Вы не можете использовать переменную внутри фигурных скобок для раскрытия скобок. Когда вы это делаете, ',' теряет всякое значение и становится просто частью строки. Просто переберите свой массив и сохраните sum строк, получающих ваш grep ... | wc -l для каждого члена массива.

Asy
9 апреля 2018 в 22:53
0

@kyodev Хороший вопрос, я об этом не подумал. Но это (решение, которое вы разместили) по-прежнему вызывает у меня ту же проблему.

Asy
9 апреля 2018 в 22:54
0

@DavidC.Rankin Итак, нет ли способа расширить скобки с помощью массива для grep, как я хотел?

kyodev
10 апреля 2018 в 00:14
0

двойная кавычка вокруг переменной: jobReports/NARX_{"$myJobs_string"}*.out

kyodev
10 апреля 2018 в 02:38
0

"$myJobs_string" — это всего лишь "${myJobs_string[@]}", а с вашим myJobs_string="${myJobs[*]} myJobs_string не является массивом

tripleee
10 апреля 2018 в 03:31
0

В данном конкретном случае отказ от использования массива может показаться очевидным и тривиальным решением. grep "Saving results to" jobReports/NARX_20197695*.out jobReports/NARX_20261798*.out

Ответы (1)

avatar
kyodev
8 апреля 2018 в 04:30
-1
#!/bin/bash

myJobs=( 20197695, 20261798 )
ifs_ini="$IFS"
IFS+=','
myJobs_string=( ${myJobs[*]} )
IFS="$ifs_ini"

echo myJobs ${myJobs[@]}
echo myJobs_string ${myJobs_string[@]}
echo jobReports/NARX_{${myJobs_string[@]}}*.out
grep -c 'Saving results to.*$' jobReports/NARX_{"$myJobs_string"}*.out
bash --version

выход

myJobs 20197695 20261798
myJobs_string 20197695 20261798
jobReports/NARX_{20197695 20261798}*.out
<not tested>

PS: grep -c ... совпадает с echo $( echo grep ... | wc -l )

Asy
10 апреля 2018 в 00:46
0

Я попробовал следующее в своем сценарии: myJobs=( 20367893 ); ifi_ini="$IFS"; IFS+=','; myJobs_string=( ${myJobs[*]} ); IFS="$ifs_ini"; echo 'Total ' $(grep "Saving results to" jobReports/NARX_{"$myJobs_string"}*.out | wc -l) ' completed jobs'; Ошибка, которую я получаю: grep: jobReports/NARX_{20367893}*.out: No such file or directory В качестве проверки: grep "Saving results to" jobReports/NARX_{20367893}*.out |wc -l дает мне правильный счет.

kyodev
10 апреля 2018 в 01:58
0

пожалуйста, используйте для проверки мой код. В вашем случае это не массив для конечного отображения. Используйте отступ, здесь нет кода. Проверьте с помощью shellcheck.net. @Аси