Você pode fazer isso com Awk, definindo a variável "Record Separator" como uma regex correspondente a pelo menos dois caracteres consecutivos de nova linha:
awk -v RS='\n\n+' '/1.*2.*3/' file.txt
Você também pode definir o "Separador de campo" como um único caractere de nova linha:
awk -v RS='\n\n+' -F '\n' '$1 == "LINE OF TEXT 1" && $2 == "LINE OF TEXT 2" && $3 == "LINE OF TEXT 3"' file.txt
Separado para legibilidade:
awk -v RS='\n\n+' -F '\n' '
$1 == "LINE OF TEXT 1" &&
$2 == "LINE OF TEXT 2" &&
$3 == "LINE OF TEXT 3"
' file.txt
Com sua exigência de apenas imprimir o nome do arquivo, se uma correspondência for encontrada, você poderá fazer isso da seguinte forma:
awk -v RS='\n\n+' -F '\n' '
$1 == "LINE OF TEXT 1" &&
$2 == "LINE OF TEXT 2" &&
$3 == "LINE OF TEXT 3" {
match++
}
END {
if (match) {
print FILENAME
}
' file.txt
Mas considerando que você está falando sobre usando find
em combinação com awk
, recomendo apenas usando o Awk para o status de saída e usando find
para a impressão:
find . -type f -exec awk -v RS='\n\n+' -F '\n' '
$1 ~ /LINE OF TEXT 1/ &&
$2 ~ /LINE OF TEXT 2/ &&
$3 ~ /LINE OF TEXT 3/ {
exit 0
}
END { exit 1 }
' {} \; -print
Dessa forma, se você quiser fazer algo mais antes de imprimir (alguns outros find
primário), você já está configurado para fazer isso.