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

最佳答案

首先,您需要的标志是-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

关于linux - 从文件中提取文本+变量不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14439869/

10-11 22:48
查看更多