在目录中搜索MS word文件以获取Linux中的特定内容

时间:2012-07-12 23:28:50

标签: linux unix ms-word

我有一个充满MS word文件的目录结构,我必须在目录中搜索特定的字符串。到目前为止,我使用以下命令在目录中搜索文件

  找到。 -exec grep -li'search_string'{} \;

     找到。 -name'*' - print | xargs grep'search_string'

但是,此搜索不适用于MS word文件。

是否可以在Linux中的MS word文件中进行字符串搜索?

10 个答案:

答案 0 :(得分:13)

我是一名翻译,几乎不知道脚本编写,但我很生气,因为grep无法扫描Word .doc文件,我制定了如何使这个小shell脚本使用catdoc和grep在.doc文件的目录中搜索给定的输入字符串。

您需要安装catdocdocx2txt个套件

#!/bin/bash
echo -e "\n
Welcome to scandocs. This will search .doc AND .docx files in this directory for a given string. \n
Type in the text string you want to find... \n"
read response
find . -name "*.doc" | 
while read i; do catdoc "$i" | 
grep --color=auto -iH --label="$i" "$response"; done
find . -name "*.docx" | 
while read i; do docx2txt < "$i" | 
grep --color=auto -iH --label="$i" "$response"; done

欢迎所有改进和建议!

答案 1 :(得分:3)

最新版本的MS Word在文本的每个字母之间插入了ascii [0],目的是我无法理解。我编写了自己的MS Word搜索实用程序,在搜索字段中的每个字符之间插入ascii [0],它工作正常。笨拙但还行。还有很多问题。也许垃圾字符并不总是一样的。需要做更多的测试。如果有人能够编写一个能够将所有这些都考虑在内的实用程序,那就太好了。在我的Windows机器上,相同的文件对搜索反应良好。 我们能做到!

答案 2 :(得分:3)

这是一种使用&#34; unzip&#34;的方法。将整个内容打印到标准输出,然后输送到&#34; grep -q&#34;检测输出中是否存在所需的字符串。它适用于docx格式文件。

#!/bin/bash
PROG=`basename $0`

if [ $# -eq 0 ]
then
  echo "Usage: $PROG string file.docx [file.docx...]"
  exit 1
fi

findme="$1"
shift

for file in $@
do
  unzip -p "$file" | grep -q "$findme"
  [ $? -eq 0 ] && echo "$file"
done

将脚本保存为&#34; inword&#34;并搜索&#34; wombat&#34;在三个文件中:

$ ./inword wombat file1.docx file2.docx file3.docx
file2.docx

现在你知道file2.docx包含&#34; wombat&#34;。您可以通过添加对其他grep选项的支持来获得更好的体验。玩得开心。

答案 3 :(得分:1)

.doc文件中,文本通常存在并且可以通过grep找到,但该文本被分解并散布着字段代码和格式信息,因此搜索您知道的短语可能不匹配。搜索非常短的东西有更好的匹配机会。

.docx文件实际上是一个zip存档,在目录结构中收集几个文件(尝试将.docx重命名为.zip然后解压缩它!) - 使用zip压缩它不太可能是grep会找到任何东西。

答案 4 :(得分:1)

opensource命令行实用程序crgrep将搜索大多数MS文档格式(我是作者)。

答案 5 :(得分:0)

你试过 awk '/某些| Word | In | Word /'document.docx?

答案 6 :(得分:0)

如果文件不是太多,你可以编写一个包含catdoc:http://manpages.ubuntu.com/manpages/gutsy/man1/catdoc.1.html之类的脚本,循环遍历每个文件,执行catdoc和grep,将其存储在bash变量中,如果是的话输出它令人满意的。

答案 7 :(得分:0)

如果您安装了名为 antiword 的程序,则可以使用此命令:

find -iname "*.doc" |xargs -I {} bash -c 'if (antiword {}|grep "string_to_search") > /dev/null 2>&1; then echo {} ; fi'

将上述命令中的“string_to_search”替换为您的文本。此命令吐出包含“string_to_search”

的文件的文件名

这个命令并不完美,因为在小文件上工作很奇怪(结果可能是不信任),因为有些研究反对词吐这个文本:

  

“我担心这个文件的文本流太小而无法处理。”

如果文件很小(无论意思是什么.o。)

答案 8 :(得分:0)

我遇到的最佳解决方案是使用unoconv将word文档转换为html。它也有一个.txt输出,但在我的情况下丢弃了内容。

http://linux.die.net/man/1/unoconv

答案 9 :(得分:0)

我找到了一种使用 ripgrep 的预处理器功能来搜索 Word 文件(docdocx)的方法。

这取决于安装的以下内容:

  • ripgrep(有关预处理器 here 的更多信息)
  • LibreOffice
  • docx2txt
  • 这个 catdoc2 脚本,我已添加到我的 $PATH 中:
#!/bin/bash

temp_dir=$(mktemp -d)
trap "rm $temp_dir/* && rmdir $temp_dir" 0 2 3 15

libreoffice --headless --convert-to "txt:Text (encoded):UTF8" --outdir ${temp_dir} $1 1>/dev/null
cat ${temp_dir}/$(basename -s .doc $1).txt

一级递归搜索的命令模式是:

$ rg --pre <preprocessor> --glob <glob with filetype> <search string> 

示例:

$ ls *
one:
a.docx

two:
b.docx  c.doc
$ rg --pre docx2txt --glob *.docx This
two/b.docx
1:This is file b.

one/a.docx
1:This is file a.
$ rg --pre catdoc2 --glob *.doc This
two/c.doc
1:This is file c.