1

我经常有很多文件(每天超过 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.
4

1 回答 1

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
于 2013-01-21T13:42:27.690 回答