如何使用 unix shell 命令从文件中间打印几行?

如何使用 unix shell 命令从文件中间打印几行?

我的文件包含以下几行,

$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

在文件 2 中,我只想要文件 1 中下面提到的这部分。

$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

我希望使用 file1 中的 shell 命令将这行代码块 (lruno.:= 72) 放在另一个文件中。我想要一个命令来读取文件并计算 lruno 的次数。 := file1 中的 72 并将其总数写到另一个文件中

答案1

使用 sed

.lruno := 72通过选择从 开始并继续到下一个的行clear,这将产生您请求的输出:

$ 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

它是如何工作的:-n告诉 sed 除非我们要求,否则不要打印。 /.lruno := 72/,/clear/p告诉它打印所有以 开头.lruno := 72和结尾的范围clear

使用 awk

使用 awk 也可以使用相同的方法:

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

就像在 sed 中一样,选择以 开头和结尾的/.lruno := 72/,/clear/行组。由于没有为这些选定的行指定任何操作,因此 awk 执行其默认操作,即打印它们。.lruno := 72clear

答案2

使用sed

< inputfile sed '1,6d; $d' > outputfile
  • < inputfile: 将内容重定向inputfilesed'sstdin
  • > outputfilesed:将 的内容重定向stdoutoutputfile
  • 1,6d:删除从第一行到第六行的所有行
  • $d: 删除最后一行

示例输出:

~/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$ 

相关内容