Você terá que extrair a ID
substring dos nomes dos arquivos. Uma maneira de fazer isso é através da expansão de parâmetros, por ex. ${var:offset:length}
no seu caso var
é f
nome, deslocamento é 5
( order
) e comprimento é ${#f}-9
(ou seja, comprimento total ${#f}
menos o comprimento combinado de order
e .log
, que é 9
caracteres):
for f in order*.log
do
ID=${f:5:${#f}-9}
grep -- "$ID" "$f" > "$ID".log
done
ou se você preferir um one-liner:
for f in order*.log; do ID=${f:5:${#f}-9}; grep -- "$ID" "$f" >" $ID".log; done
Como alternativa, você pode usar awk
para aplicar a mesma ação em vários arquivos :
awk '
FNR==1{
if(fname)close(fname)
id=substr(FILENAME, 6, length(FILENAME)-9)
fname=id".log"
}
$0 ~ id{
print > fname
}
' order*.log
Isso faz todos os arquivos com uma invocação awk
, evitando o loop do shell. Em uma linha:
awk 'FNR==1{if(f)close(f);id=substr(FILENAME, 6, length(FILENAME)-9);f=id".log"} $0~id{print > f}' order*.log