在日志文件中搜索特定文本,然后将日志文件的所有内容合并到一个文件中

时间:2017-03-18 07:14:28

标签: linux bash

我目前正在运行一个程序,将药物停靠在某些蛋白质上并给它一个等级。对于一次运行,它创建一个带有文件的唯一目录:log.txt和out.pdbqt(.pdbqt文件基本上是药物的3D坐标)。我为成千上万的药物做这个,所以我在一个主目录中创建了数千个子目录。它造成了一团糟。我想知道Linux终端或bash脚本的命令在所有目录中的所有log.txt文件中搜索特定文本(文本示例为-8。*或-12。*)是什么然后,将包含具有特定文本的文件的任何目录复制到名为results的新文件中。我想要合并.pdbqt文件(它可能会弄乱xyz坐标)。基本上我希望所有在log.txt文件中包含文本的目录,我搜索的文件都被复制到一个名为results的目录中。

我正在运行的效率较低的是这个。

`#! /bin/bash

for f in drugbank/ligands_*.pdbqt; do
    b= basename $f .pdbqt
    echo Processing ligand $b
    mkdir -p $b
    ./vinaXB --config conf.txt --ligand $f --out ${b}/out.pdbqt --log ${b}/log.$
done`

这样做是为子目录/ drugbank /中的所有药物运行程序 并根据药物文件的标题在程序所在的主目录中创建目录。在这种情况下,配体_ *。pdbqt。

然后我用:

find . -type f -name "*.txt" -exec grep -il '-8.*' {} \;

然后我手动将给定文件复制并粘贴到一个文件夹中,然后仔细检查它是否给出了合适的分数。

另外,如果你能给我一个linux命令,告诉程序打开所有子目录中具有给定名称的所有文件,这些文件将是极好的。假设我已经使用了导出并更改了./~bashrc。

干杯!

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,那么解决问题只是一小部分:

我通过以下命令模拟了您的问题:

$ find . -name "*.cc" -exec grep -l 'main' {} \;
./autocorrelation.cc
./QATM/testQATM.cc
./QDockTreeView/testQDockTreeView.cc
./QFileDialog/testQFileDialog.cc
./QFontMetric/testQFontMetric.cc
./QGLWidgetHUD/testQGLWidgetHUD.cc
./QLabelImage/testQLabelImage.cc
./QPopup/testQPopup.cc
./QProcess/testQProcess.cc
./QRadioButtonRichText/testQRadioButtonRichText.cc
./QTableViewNoScroll/testQTableViewNoScroll.cc
./QWidgetKineticScroll/testQWidgetKineticScroll.cc
./test-bimap-mt.cc
./test-bimap.cc
./test-cout.cc
./test-dup-symbol.cc
./test-hex.cc
./test-longdouble.cc
./test-master-slave.cc
./test-op-plus.cc
./test-swap.cc
./testVecRef.cc
./testVSDebug.cc

它提供了包含特定模式的每个文件的路径列表(在我的例子中为main)。那么,这个清单怎么办?我将其输入while read循环以进行进一步处理:

$ find . -name "*.cc" -exec grep -l 'main' {} \; \
> | while read FILE; do echo cp "$FILE" ./hits/ ; done
cp ./autocorrelation.cc ./hits/
cp ./QATM/testQATM.cc ./hits/
cp ./QDockTreeView/testQDockTreeView.cc ./hits/
cp ./QFileDialog/testQFileDialog.cc ./hits/
cp ./QFontMetric/testQFontMetric.cc ./hits/
cp ./QGLWidgetHUD/testQGLWidgetHUD.cc ./hits/
cp ./QLabelImage/testQLabelImage.cc ./hits/
cp ./QPopup/testQPopup.cc ./hits/
cp ./QProcess/testQProcess.cc ./hits/
cp ./QRadioButtonRichText/testQRadioButtonRichText.cc ./hits/
cp ./QTableViewNoScroll/testQTableViewNoScroll.cc ./hits/
cp ./QWidgetKineticScroll/testQWidgetKineticScroll.cc ./hits/
cp ./test-bimap-mt.cc ./hits/
cp ./test-bimap.cc ./hits/
cp ./test-cout.cc ./hits/
cp ./test-dup-symbol.cc ./hits/
cp ./test-hex.cc ./hits/
cp ./test-longdouble.cc ./hits/
cp ./test-master-slave.cc ./hits/
cp ./test-op-plus.cc ./hits/
cp ./test-swap.cc ./hits/
cp ./testVecRef.cc ./hits/
cp ./testVSDebug.cc ./hits/

一些注意事项:

  1. 我使用\ ENTER 格式化命令。第二行开头的>是bash的输出(通知行继续)。你可以把这一切都留下来。

  2. 我的实际循环命令是echo。如果我删除它,循环已复制所有文件(并使我的SSD上的左侧可用空间更小)。我确定您可以用适合您情况的任何内容替换echo cp

  3. 我在Windows 10(64位),cygwin和bash上做过这个,但它也适用于Linux(以及其他所有类Unix操作系统)。

  4. 再次阅读您的问题后,我注意到您要求(在标题中)将所有文件合并到一个文件中。我在文中以某种方式错过了它。

    但是,cat是命令用于 cat -enate文件。在这种情况下,cat仅用于输出,并且通过附加重定向>>来实现连接,例如:

    $ rm ./hits.txt ; find . -name "*.cc" -exec grep -l 'main' {} \; \
    | while read FILE; do cat "$FILE" >> ./hits.txt ; done
    rm: cannot remove './hits.txt': No such file or directory
    
    $ ls -l hits.txt
    -rw-rw-r--+ 1 ????? ????? 81698 Mar 18 09:19 hits.txt
    

    注意:

    1. 我还检查了less hits.txt是否有效。确实如此,但我不想在这里粘贴所有输出(81698字节)。

    2. 仅当./hits.txt不可用时才会出现错误消息rm: cannot remove './hits.txt': No such file or directory>>表示"追加"。因此,在收集新内容之前删除以前的结果可能很重要。因为,我过去常常从bashs历史中重新调用命令行,所以重复调用是合理的。 (但是,如果rm以这种方式失败,则不应该有任何令人烦恼的副作用。)