Я предполагаю, что вы генерируете search_script.sh
автоматически из содержимого in_file
.Если вы можете посчитать, сколько раз вы будете повторять одну и ту же команду grep, вы можете просто использовать grep один раз и использовать head
, например, если вы знаете, что будете использовать ее 2 раза:
grep "foo" bar.txt | head -2
Выведет первые 2 вхождения "foo" в bar.txt.
Если вам нужно выполнять команды grep отдельно, например, если между командами grep есть другой код, вы можете смешивать head
и tail
:
grep "foo" bar.txt | head -1 | tail -1
Some other commands...
grep "foo" bar.txt | head -2 | tail -1
head -n
отображает первые n
строки ввода tail -n
отображает последние n
строки ввода
Если вы действительно ДОЛЖНЫ всегда использоватьта же команда, но убедитесь, что выходные данные всегда различаются. Единственный способ, которым я могу придумать, - это использовать временные файлы и сложную последовательность команд:
cat foo.bar.txt.tmp 2>&1 | xargs -I xx echo "| grep -v \\'xx\\' " | tr '\n' ' ' | xargs -I xx sh -c "grep 'foo' bar.txt xx | head -1 | tee -a foo.bar.txt.tmp"
Итак, для объяснения этой команды, приведенной foo
в качестве строки поиска и bar.txt
в качестве имени файла, тогда foo.bar.txt.tmp
- это уникальное имя для временного файла.Временный файл будет содержать строки, которые уже были выведены:
cat foo.bar.txt.tmp 2>&1
: выводит содержимое временного файла.Если ничего не присутствует, выводит сообщение об ошибке в stdout (важно, потому что, если вывод был пустым, остальная часть команды не будет работать.) xargs -I xx echo "| grep -v \\'xx\\' "
добавляет | grep -v
к началу каждогострока во временном файле grep -v something
исключает строки, которые включают something
. tr '\n' ' '
заменяет символы новой строки пробелами, чтобы в одной строке была последовательность grep -v
s. xargs -I xx sh -c "grep 'foo' bar.txt xx | head -1 | tee -a foo.bar.txt.tmp"
запускает новую команду, grep 'foo' bar.txt xx | head -1 | tee -a foo.bar.txt.tmp
, заменяя xx
предыдущим выводом.xx
должна быть последовательностью grep -v
с, исключающей предыдущие выходы. head -1
обеспечивает вывод только одной строки за раз tee -a foo.bar.txt.tmp
добавляет новый вывод квременный файл.
Просто обязательно очистите временные файлы rm *.tmp
в конце вашего скрипта.