Veja um script sh que produz os resultados de que você precisa.
#!/bin/sh
grep -f /path/to/patterns.txt /path/to/*_856_2017* | sort -u > /path/to/foundFiles.txt
while read -r LINE
do
grep -F "$LINE" /path/to/foundFiles.txt
if [ $? -eq 1 ]
then
echo "$LINE" not found
fi
done < /path/to/patterns.txt
Neste script, presumo que você envie os resultados de seu grep para o arquivo found.txt e armazene seus padrões no arquivo /path/to/foundFiles.txt .
Como você pode ver, o grep no loop produzirá o mesmo conteúdo do arquivo found.txt ao adicionar "$pattern" not found para os que faltam.
Eu também criei uma segunda abordagem para o seu caso:
#!/bin/sh
grep -f /path/to/patterns.txt /path/to/*_856_2017* |
sort -u > /path/to/foundFiles.txt
comm -23 /path/to/patterns.txt /path/to/foundFiles.txt |
xargs -L 1 -I {} echo {} not found > /path/to/notFoundFiles.txt
cat /path/to/foundFiles.txt /path/to/notFoundFiles.txt > /path/to/finalList.txt
Nesse caso, patterns.txt precisa estar classificado para comm para funcionar.
O comando comm compara os dois arquivos que retornam as linhas presentes apenas em patterns.txt ( -23 parameter), que é a lista de padrões não encontrados por grep .
Em seguida, xargs pega cada linha ( -L 1 ) e ecoa a linha ( {} ) com "não encontrado" anexada a ela. O resultado de xargs é redirecionado para o arquivo notFoundFiles.txt .
Finalmente, você simplesmente concatena foundFiles.txt e notFoundFiles.txt em finalList.txt .