Я не могу понять, как выполнять итерацию по совпадению с выводом grep при использовании флагов -A или -B (возвращая несколько строк для одного совпадения). Я не против использования awk для этого, но он будет использоваться для проверки нескольких больших файлов, поэтому чем короче время выполнения, тем лучше.
Я подумал, что смогу добиться этого, используя флаг --group-separator grep и установив IFS на тот же символ, но, похоже, это не так.
$ grep --group-separator=@ -B2 'locked' thisisatest | while IFS=@ read -r match; do
echo "a"
echo "${match}"
done
a
this is a test file asdflksdklsdklsdkl.txt
a
this is meaningless
a
this is locked
a
a
this is a test file basdflksdklsdklsdkl.txt
a
this is meaningless
a
this is locked
$ cat thisisatest
this is a test file asdflksdklsdklsdkl.txt
this is meaningless
this is locked
j
j
j
j
j
this is a test file basdflksdklsdklsdkl.txt
this is meaningless
this is locked
Я ожидаю, что "a" будет напечатано до и после всего совпадения, например:
a
this is a test file asdflksdklsdklsdkl.txt
this is meaningless
this is locked
a
Изменение $IFS
определяет, как read
разбивает строку на поля. Он заполняет только одно поле за раз ($match
), поэтому разделитель полей не имеет значения. Вместо этого измените разделитель строк: используйте read -d
.
grep ... | while read -d@ -r match; do
Кажется, что последний результат не попал в $match
.
Глядя на предоставленный ответ здесь, добавляя || [ -n "$match" ]
после того, как while read
устранил указанную выше проблему.
Пожалуйста, добавьте образец ввода и желаемый результат для этого образца ввода к вашему вопросу.