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