如何告诉grep继续下一个

时间:2014-01-03 14:18:37

标签: grep

我有一个巨大的文件,我有兴趣检索几个值(长数字)。大多数情况下,数字从行尾开始,一直持续到下一行的开头,grep无法全部检索。

例如,我的数字采用以下格式:-1234.1234567所以当我使用

grep -Eo '-[0-9]{4}.[0-9]{7}' 

它不会返回所有值,因为有时数字会这样:

blah blah blah ....-1234.12

34567 blah blah blah

那么,有没有办法告诉grep继续查找(如果需要)到下一行来检索该数字的所有7位小数?

由于

2 个答案:

答案 0 :(得分:0)

你应该能够删除水平空格,然后预先形成你的grep。

尝试:cat myfile | tr -d [:blank:] | grep -Eo '-[0-9]{4}.[0-9]{7}'

如果你想对目录中的所有文件执行此操作,只需使用for循环:

for i in *; do cat $i | tr -d [:blank:] | grep -Eo '-[0-9]{4}.[0-9]{7}'; done

答案 1 :(得分:0)

这将按照您的要求执行(将GNU awk用于ENDFILE):

gawk -v OFS=': ' '
{ rec = rec $0 }
ENDFILE {
    while ( match(rec,/-[[:digit:]]{4}[.][[:digit:]]{7}/) ) {
        print FILENAME, substr(rec,RSTART,RLENGTH)
        rec = substr(rec,RSTART+RLENGTH)
    }
    rec = ""
}
' *

例如:

$ cat file1
blah blah blah ....-1234.12

34567 blah blah blah

blah blah blah ....-2345.2345

678 blah blah blah

$ cat file2
blah blah blah ....-4321.12

34567 blah blah blah

blah blah blah ....-9876.2345

678 blah blah blah

$ gawk -v OFS=': ' '
{ rec = rec $0 }
ENDFILE {
    while ( match(rec,/-[[:digit:]]{4}[.][[:digit:]]{7}/) ) {
        print FILENAME, substr(rec,RSTART,RLENGTH)
        rec = substr(rec,RSTART+RLENGTH)
    }
    rec = ""
}
' file1 file2
file1: -1234.1234567
file1: -2345.2345678
file2: -4321.1234567
file2: -9876.2345678

尝试使用一些真实的示例输入,其中包括以8位数而不是7位结尾的字符串边缘情况,并让我们知道任何其他要求。

如果你没有GNU awk,你可以对FNR == 1和END时调用match()的函数做同样的事情。还有各种各样的选择......