Это не совсем одна строка, но вы можете удалить новые строки, и проблема решена:)
for file in $(ls) ; do
awk "/str1/{found=1}/str2/{if(found) print \"$file\"}" $file
done
Что он делает: для каждого файла, указанного в ls
, если в нем появляется str1
, сценарий помечает его в переменной found
:
/str1/{found=1}
затем, когда в строке появляется str2
, он проверяет, установлен ли found
. Если это так, печатается имя файла:
/str2/{
if (found)
print "$file"
}
РЕДАКТИРОВАТЬ : есть еще более краткий способ решить вашу проблему, используя find
и xargs
:
find . -print0 -maxdepth 1 | \
xargs -0 -I{} awk '/str1/{found=1}/str2/{if(found) print "{}"}' "{}"
Это также безопаснее, потому что он обрабатывает файлы с пробелами в их именах. Кроме того, вы можете расширить его для поиска в подкаталогах, просто удалив опцию -maxdepth 1
. Обратите внимание, что сценарий awk
не был изменен.
(всегда есть хорошее решение с использованием find
и xargs
, но это решение всегда немного сложно найти: D)
НТН!