Como grep vários arquivos usando parte do nome do arquivo como um padrão?

1

Eu tenho uma pasta que inclui vários arquivos chamados order[ID].log , em que [ID] é uma string, por exemplo,

orderID1.log
orderID2.log
orderID3.log
orderID4.log
...

Eu preciso escrever um script no Linux para grep de cada arquivo pelo ID em seu nome e enviar o resultado para um arquivo chamado ID.log Exemplo:
Para orderID1.log , preciso de grep 'ID1' orderID1.log > ID1.log
Para orderID2.log , preciso de grep 'ID2' orderID2.log > ID2.log
Eu tentei escrever o script abaixo,

for i in ORDER*.log 
do 
grep 'i' order$i > $i.log;
done

O problema aqui é que eu gravarei como "orderID1", "orderID2" em vez de "ID1", "ID2". Existe uma maneira simples de fazer isso no linux?

    
por Alan Yu 30.10.2015 / 15:30

1 resposta

2

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
    
por 13.04.2017 / 14:36

Tags