Unix命令在文件中查找字符串并仅使用字符串打印模式文本

时间:2015-03-06 06:47:44

标签: shell unix awk sed

如果模式使用unix命令具有特定字符串,我只想打印匹配模式。

例如:在25487文件中找到xyz.txt,然后将pleasetill here之间的文本从xyz.txt文件打印到新文件。

xyz.txt文件......

.........
..
....
...

please print 25487 this
sadf
sdfa
sdfasgda
till here

.....
.........
..

please print 45862 this
qret
ret
ASF
H
till here
.........
..
....
...

最后只打印

please print 25487 this
sadf
sdfa
sdfasgda
till here

5 个答案:

答案 0 :(得分:2)

sed可以很容易地做到这一点。

 sed -n '/25487/, /till here/ p'

<强>测试

$ sed -n '/25487/, /till here/ p' input
please print 25487 this
sadf
sdfa
sdfasgda
till here

它的作用是什么?

  • -n禁止打印图案空间

  • '/25487/, /till here/地址范围。选择两个模式之间的所有行并执行以下操作。

    此处选择25487till here

  • 之间的行
  • p打印图案空间。

答案 1 :(得分:1)

你可以使用grep。

$ grep -oPz '(?s)\bplease\b.*?25487.*?\btill here\b' file
please print 25487 this
sadf
sdfa
sdfasgda
till here

(?s) DOTALL修饰符,它使正则表达式中的点也匹配换行符。默认情况下,点不会匹配换行符。

答案 2 :(得分:1)

只需使用grep中的上下文选项即可获取当前行之后的行。 -A选项会为您提供所需的内容,只需指定当前行后您想要的行数,这样就可以了:

grep -A 4 25487 xyz.txt > newfile.txt

-A 4将匹配当前匹配行之后的4行。如果您在使用-B之前想要4行,并且如果您想要在当前行之前和之后使用-C

答案 3 :(得分:1)

一个简单的awk

awk '/25487/,/till here/' xyz.txt
please print 25487 this
sadf
sdfa
sdfasgda
till here

如果您还有其他测试,这样做会更好:

awk '/25487/{f=1} f; /till here/{f=0}' xyz.txt

或者

awk '/25487/{f=1} /till here/{f=0;print} f' xyz.txt

答案 4 :(得分:0)

sed '/please/,/till here/!d
     H
     /till here/!b
     s/.*//
     x
     /25487/!d
     s/.//p' YourFile
  • 请注意不在以please开头,以till here结尾并且循环(转到下一行条目)的部分之外
  • 存储该行
  • 如果不与till here一致,则循环
  • 空当前行
  • 与缓冲内容交换
  • 如果内部没有25847,请删除并循环
  • 删除第一个字符(一个额外的新行)并打印,而不是循环