как распаковать определенные файлы из архива и grep параллельно в bash - PullRequest
0 голосов
/ 19 января 2019

У нас есть большое количество тарболов, и в каждом тарболе мне нужно искать конкретный шаблон только в некоторых файлах, имена которых известны заранее.

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

echo "a.txt" > file_subset_in_tar.txt
echo "b.txt" >> file_subset_in_tar.txt
echo "c.txt" >> file_subset_in_tar.txt
tarball_name="tarball.tgz";
pattern="mypattern"
echo "pattern: $pattern"

(parallel -j-2 tar xf $tarball_name -O ::: `cat file_subset_in_tar.txt` | grep -ac "$pattern")

Это прекрасно работает непосредственно на терминале bash.Однако, когда я вставляю это в скрипт с bash ударом вверху, он просто печатает ноль.

Если я заменю $pattern на жестко закодированную строку, все будет нормально.Такое ощущение, что что-то не так с секвенированием канала или чем-то подобным.Таким образом, в идеале будет приветствоваться обновление вышеупомянутой попытки или другое решение, которое удовлетворяет упомянутым требованиям использования диска / памяти.

1 Ответ

0 голосов
/ 19 января 2019

Я считаю, что ваша команда parallel составлена ​​неправильно.Вы можете запустить конвейер команд, таких как:

parallel -j -2 "tar xf $tarball_name -O {} | grep -ac $pattern" :::: file_subset_in_tar.txt

Также обратите внимание, что обратные метки и использование cat не нужны, параметры могут быть переданы в parallel из файла, используя ::::.

...