如何从匹配字符串打印文件直到EOF

时间:2015-03-16 16:37:57

标签: linux bash awk sed solaris

以下命令打印文件,直到匹配WORD

 awk '1;/WORD/{exit}' file

但是如何从字符串WORD打印文件直到文件末尾不包含字符串WORD?

4 个答案:

答案 0 :(得分:1)

正如Etan Reisner在评论中所说,this answer中有一个很好的范围模式食谱。但是从模式匹配到文件末尾的最简单方法是:

awk '/WORD/,0' file  

为了从包含图案的线后面的线进行打印,我们可以这样做:

awk 'found,0;/WORD/{found=1}' file

要在WORD之后打印与WORD匹配的第一行的部分,只需要修改最后一个动作,但通过显式调用match来替换正则表达式很方便。为了设置RSTART和RLENGTH:

awk 'found,0;match($0,/WORD/){found=1;print substr($0, RSTART+RLENGTH}'

范围模式具有表达式 表达式的形式,其含义是从匹配第一个表达式的第一行到第一行与最后一个表达式匹配,包含。重复该范围,直到文件完全处理完毕。

在这些示例中,第二个表达式总是计算为0(false),因此范围永远不会终止,并且一旦模式成功,所有行都匹配。

同样,另一种解决"打印所有行直到模式的方式"将是以下,虽然效率较低,因为它读取整个文件:

awk 'NR==1,/WORD/' file

此外,如果目标是仅打印模式的实例(与包含模式的完整行相反,我们可以对原始程序进行简单修改:

awk 'match($0, /WORD/){print(sub($0,1,RSTART+RLENGTH)); exit}1'

答案 1 :(得分:1)

这可能是你想要的:

$ cat file                                 
As market-days are wearing late,
And folk begin WORD to tak the gate;
While we sit bousin, at the nappy,
And gettin fou and unco happy,

$ awk '!f && sub(/.*WORD/,""){f=1} f' file
 to tak the gate;
While we sit bousin, at the nappy,
And gettin fou and unco happy,

答案 2 :(得分:0)

如果文字只有一个pattern,则此gnu awk(由于RS引起的gnu)将起作用:

awk -v RS="WORD" 'NR>1' file

它将作为Eds解决方案工作,从WORD之后的第一个数据开始,打印剩下的行以及EOF的所有下一行


这将在找到WORD之后打印下一行,直到EOF
如果在WORD看到Eds回答后需要同一行的数据。

awk 'f;/WORD/{f=1}' file

示例,模式four

cat file
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
10 ten

awk 'f;/four/ {f=1}' file
5 five
6 six
7 seven
8 eight
9 nine
10 ten

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed '1,/WORD/{/WORD/!d;s//\n/;D}' file

这将删除WORD之前的所有行,然后用换行符替换WORD并删除直到并包括换行符。其余文件正常打印。