
Então eu tenho que passar por um log que recebi por e-mail (no Windows), procurar uma linha para determinar o número de série do modelo, imaginei que uma maneira fácil de fazer isso era escrever um script em lote feio para converter o .msg, então eu pode ler o arquivo. exemplo:
cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt
isso me deixa com 3 números exclusivos, como adicionaria ALPHA à linha 1, BETA à linha 2 e GAMMA à linha 3 com um espaço ou : como delimitador?
Atualizar:o arquivo a21s.txt
é semelhante a
0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414
Responder1
Há muitas maneiras de fazer o que você está procurando, apenas alguns exemplos.
awk
e uma solução personalizada
Uma solução adaptada ao seu exemplo é usar awk
e passar 3 variáveis para ele. Não é geral porque se você vai ter 4 linhas terá que passar 4 variáveis e assim por diante...
O awk
comando tem a forma simples de gerenciar a coluna através do seu número ( $1
, $2
... $NF
o último).
Só para simplificar a leitura aqui, eu uso seu antigo arquivo intermediário
a21s.txt
awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" ' NR==1 {print s1,$7} ; NR==2 {print s2,$7} ; NR==3 {print s3,$7} ; ' a21s.txt
- Na primeira linha você passa 3 variáveis para
awk
com a opção-v
. - Nas linhas a seguir você usa que a variável internaNR, mantém a contagem do número da linha. Então você vai imprimir a variávels1, somente quando você tiver a primeira linha, os2com o segundo... e assim por diante.
- Na última linha após
'
você pode especificar o nome do arquivo para não precisar chamar ocat
processo e canalizá-lo paraawk
aquele. - Se a variável (ALPHA,BETA...) for gerada com algum mecanismo (ex. "Serial01, Serial02") você pode colocá-la no lugar dos controles no número da linha e na variável externa.
- Na primeira linha você passa 3 variáveis para
Nota prática:sob *nix você podetrens de comandoscanalizar (
|
) uma saída para a seguinte sem a necessidade de criar arquivos intermediários.
Então, no seu exemplo, você poderia usar diretamente:cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
Em vez disso,
cut
neste caso você pode usar oawk
comandocat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt
.
Uma solução mais geral: paste
+awk
Digamos que você tenha seu a21s.txt
arquivo e outro ( b.txt
) com o mesmo número de linhas e dentro das strings (uma palavra cada) que deseja prefixar (como a seguir).
ALPHA
BETA
GAMMA
você pode simplesmente usar
paste b.txt a21.txt | awk '{print $1,$8}' > Air21Serials.txt
Observe que agora a coluna do seu serial é a 8 porque você adicionou outra antes com colar.
Observação
peça ao próprio Linux mais informações com man awk
eman paste
:-)
Responder2
eco ALFA>agrep.txt; gato "Pré.msg" | strings2>>agrep.txt
essa pode não ser a linha exata. O conceito é que vocêprimeirodeseja colocar a palavra "Alpha" no arquivo. Usar um símbolo > cria o arquivo e usar >> anexa ao arquivo. Sem uma "nova linha", deve-se colocar a palavra ALPHA ali e depois anexar a primeira mensagem.
talvez seja necessário brincar um pouco para que o código funcione exatamente.
EDIT: Pesquisa encontrada usandogatoeimprimirsão opções melhores do que echo, pois o echo pode ser diferente dependendo do sistema operacional
por exemplo: cat ("ALPHA: ") > agrep.txt ; gato "Pré.msg" | strings2>>agrep.txt
E para executar um comando "one liner", o primeiro canal deveria ter sido um ; ou &&
; entre comandos sempre executa o próximo comando && entre comandos executa o próximo comando somente se o anterior for bem-sucedido e || (tubo duplo) executa o próximo comando somente se o anterior falhou
Responder3
Não tenho certeza do que strings2
é ou como é sua opinião, não posso ter 100% de certeza de que funcionará conforme o esperado. Mas talvez isso pelo menos indique a direção certa. cat
pode aceitar entrada de stdin. Então, você também poderia fazer
echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt