Como imprimir algumas linhas do meio de um arquivo usando comandos shell unix? [fechadas]

1

Meu arquivo contendo as seguintes linhas,

$BQ  
{ VOL       @home    }  
database    daba  
relation    tcdeatid  
opendb  
clear    
.lruno := 72         <-- (This line lruno. := 72 has 10 times in my file1)
.infno := 1  
.tid.noel := 101       
writedb       
clear  
.lruno := 72  
.infno := 205  
.tid.noel := 191      
writedb       
clear    
$EOF

No arquivo no.2, quero apenas essa parte mencionada abaixo do arquivo1.

$BQ  
{ VOL       @home    }  
database    daba  
relation    tcdeatid  
opendb  
clear
.lruno := 72           
.infno := 1  
.tid.noel := 101  
.lruno := 72           
.infno := 205  
.tid.noel := 191
.lruno := 72           
.infno := 0  
.tid.noel := 1111  
.lruno := 72           
.infno := 56  
.tid.noel := 231
.lruno := 72           
.infno := 45  
.tid.noel := 61  
.lruno := 72           
.infno := 23  
.tid.noel := 901
.lruno := 72           
.infno := 123  
.tid.noel := 1611  
.lruno := 72           
.infno := 786  
.tid.noel := 81
.lruno := 72           
.infno := 55  
.tid.noel := 1  
.lruno := 72           
.infno := 253  
.tid.noel := 121
writedb       
clear  
$EOF

Eu quero este pedaço de linhas (lruno.: = 72) em outro arquivo usando comandos shell do arquivo1. Eu quero o comando que vai ler o arquivo e contar quantas vezes tem lruno. : = 72 no arquivo1 e anote o total para outro arquivo.

    
por pmaipmui 11.06.2015 / 21:02

2 respostas

1

Usando sed

Ao selecionar as linhas que começam com .lruno := 72 e continuar até o próximo clear , isso produzirá a saída solicitada por você:

$ sed -n '/.lruno := 72/,/clear/p' file
.lruno := 72
.infno := 1
.tid.noel := 101
.tid.info := 64
.tid.setnr := 1225
.typeidm := 1
.sourcetable := 2
writedb
clear
.lruno := 72
.infno := 205
.tid.noel := 101
.tid.info := 76
.tid.setnr := 1225
.typeidm := 1
.sourcetable := 2
writedb
clear

Como funciona: -n diz ao sed para não imprimir a menos que o solicitemos. /.lruno := 72/,/clear/p diz para imprimir todos os intervalos que começam com .lruno := 72 e terminam com clear .

Usando o awk

A mesma abordagem funciona usando o awk:

awk '/.lruno := 72/,/clear/' file

Assim como no sed, /.lruno := 72/,/clear/ seleciona grupos de linhas que começam com .lruno := 72 e terminam com clear . Como nenhuma ação é especificada para as linhas selecionadas, o awk executa sua ação padrão, que é imprimi-las.

    
por 11.06.2015 / 21:25
0

Usando sed :

< inputfile sed '1,6d; $d' > outputfile
  • < inputfile : redireciona o conteúdo de inputfile para sed ' stdin
  • > outputfile : redireciona o conteúdo de sed stdout para outputfile
  • 1,6d : exclui todas as linhas do 1º ao 6º inclusive
  • $d : apaga a última linha

Exemplo de saída:

~/tmp$ cat inputfile
$BQ
{ VOL @home }
database daba
relation tcdeatid
opendb
clear
.lruno := 72
.infno := 1
.tid.noel := 101
.tid.info := 64
.tid.setnr := 1225
.typeidm := 1
.sourcetable := 2
writedb
clear
.lruno := 72
.infno := 205
.tid.noel := 101
.tid.info := 76
.tid.setnr := 1225
.typeidm := 1
.sourcetable := 2
writedb
clear
.lruno := 18
.infno := 2
.tid.noel := 100
.tid.info := 34
.tid.setnr := 125
.typeidm := 9
.sourcetable := 2
writedb
clear
.lruno := 18
.infno := 25
.tid.noel := 1101
.tid.info := 71
.tid.setnr := 1425
.typeidm := 1
.sourcetable := 3
writedb
clear
$EOF
~/tmp$ < inputfile sed '1,6d; $d'
.lruno := 72
.infno := 1
.tid.noel := 101
.tid.info := 64
.tid.setnr := 1225
.typeidm := 1
.sourcetable := 2
writedb
clear
.lruno := 72
.infno := 205
.tid.noel := 101
.tid.info := 76
.tid.setnr := 1225
.typeidm := 1
.sourcetable := 2
writedb
clear
.lruno := 18
.infno := 2
.tid.noel := 100
.tid.info := 34
.tid.setnr := 125
.typeidm := 9
.sourcetable := 2
writedb
clear
.lruno := 18
.infno := 25
.tid.noel := 1101
.tid.info := 71
.tid.setnr := 1425
.typeidm := 1
.sourcetable := 3
writedb
clear
~/tmp$ 
    
por 11.06.2015 / 21:09

Tags