从文件中提取文本+变量不起作用

时间:2013-01-21 13:36:06

标签: linux bash unix grep

我有很多文件(每天超过1500个),我必须搜索“\ HF =”,然后有一个值 示例

\HF=-546.523456

这几乎不是相同的值,大部分时间都是负值。

这里的问题是“\ HF”出现在文件底部附近,但它可能出现在两个连续的行中,如下所示:

bla bla bla \H
F=number

bla bla bla \
HF=number

我谷歌很多并且混合了很多这样的阅读,我得到了这个:

grep "\\\\HF=[-]\?[0-9]*[.]\?[0-9]*\\\\" *.log

(这些是.log文件)

当我没有得到确切的“\ HF”时,grep命令不起作用;我不知道为什么,-r也不起作用,我有很多子目录。

你能帮我创建一个bash脚本吗?

以下是文件底部的示例

 -1.8078238555,2.9578874797\H,-6.5637417591,1.9616010611,-0.4401499738\
 H,-6.788515386,1.1005867152,1.097842586\H,-6.6310211349,0.1875790572,-
 0.4056194057\\Version=EM64L-G09RevB.01\State=1-A\HF=-2032.6976718\RMSD
 =5.982e-09\RMSF=5.561e-07\Dipole=3.5537566,0.6605675,0.6605341\Quadrup
 ole=-5.9562335,7.5807637,-1.6245302,-27.037518,-2.3011825,2.5397027\PG
 =C01 [X(C37H33B1O8)]\\@


 THE WORLD IS MADE UP OF THE WILLS, THE WON'TS, AND THE CANT'S:
 THE WILLS DO EVERYTHING,
 THE WON'TS DO NOTHING,
 THE CAN'TS CAN'T DO ANYTHING.

                               -- FROM WALT DISNEY'S "BLACK HOLE"
 Job cpu time:  1 days  5 hours 59 minutes 54.7 seconds.
 File lengths (MBytes):  RWF=   2510 Int=      0 D2E=      0 Chk=     20 Scr=      1
 Normal termination of Gaussian 09 at Mon Dec 24 19:58:22 2012.

1 个答案:

答案 0 :(得分:1)

嗯,首先,你想要的标志是-R,通过目录递归grep

其次,既然您知道所需的信息是在文件的末尾,请为您获取足够的信息以确保信息存在,删除换行符并进行简单搜索。

您可以执行以下操作:

tail -30 <file> | sed "s/^ *\(.*\) *$/\1/" |
    tr -d "\n" | grep -oP "\\\\HF=[-]?\d+\.\d+"

由于您必须递归执行此操作,因此您可以使用xargs

find . -type f -name '*.log' -print0 |
    xargs -0 -I {} bash -c 'tail -30 "{}" | sed "s/^ *\(.*\) *$/\1/" |
        tr -d "\n" | grep --label "{}" -oHP "\\\\HF=[-]?\d+\.\d{1,4}"'

如果数字可能不包含小数,您可以将表达式更改为:

... grep --label "{}" -oHP "\\\\HF=[-]?\d+(\.\d{1,4})?"

使用“temp.log”文件:

bla bla bla \
HF=-546.523456
something else but a number
bla bla bla \
HF=-546.523456
something else but a number

输出结果为:

./temp.log:\HF=-546.523456
./temp.log:\HF=-546.523456