我有一個完整的MS字文件的目錄結構,我必須搜索特定字符串的目錄。到目前爲止,我正在使用以下命令來搜索目錄中的文件搜索Linux中特定內容的目錄中的MS字文件
查找。 -exec grep -li'search_string'{} \;
找到。 -name'*'-print | xargs grep'search_string'
但是,此搜索不適用於MS word文件。
是否可以在Linux的MS word文件中進行字符串搜索?
我有一個完整的MS字文件的目錄結構,我必須搜索特定字符串的目錄。到目前爲止,我正在使用以下命令來搜索目錄中的文件搜索Linux中特定內容的目錄中的MS字文件
查找。 -exec grep -li'search_string'{} \;
找到。 -name'*'-print | xargs grep'search_string'
但是,此搜索不適用於MS word文件。
是否可以在Linux的MS word文件中進行字符串搜索?
您是否嘗試過awk'/ Some | Word | In | Word /'document.docx?
嘗試不起作用。 – JoshMachine 2012-07-12 23:53:54
嗯,訣竅是首先提取doc文件(它包含document.xml),然後grep/awk它 – 2012-07-13 16:57:33
在一個.doc
文件中,文本通常存在,可以通過grep找到,但文本被分解並散佈字段代碼和格式信息,因此搜索您知道的短語可能不匹配。搜索非常短的東西有更好的匹配機會。
一個.docx
文件實際上是一個zip
檔案的目錄結構收集幾個文件一起(嘗試重命名的.docx爲.zip然後解壓吧!) - 用zip壓縮它不太可能的grep會發現任何東西。
@ Stephen P 它的一個.doc文件和超過3個字符的任何搜索不起作用。 – JoshMachine 2012-07-12 23:44:18
@JoshMachine - 作爲一個測試,你可能想嘗試在其中一個'vim -bnR somefile.doc'上看看裏面有什麼,然後嘗試grep你在文件中看到的東西。 – 2012-07-13 00:07:27
如果它不是太多的文件,你可以編寫一個腳本,結合像catdoc:http://manpages.ubuntu.com/manpages/gutsy/man1/catdoc.1.html這樣的文件,循環遍歷每個文件,執行catdoc和grep,將其存儲在bash變量中,並在滿意的情況下輸出。
如果已安裝的程序稱爲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」
命令是不完美的,因爲對小文件的工作怪異文件的文件名(S)(其結果可能是untrustful),becasue一些reseaon antiword吐出這樣的文字:
「恐怕這個文件的文本流太小,無法處理。」
如果文件很小(不管它指的.o。)
爲'doc',但不是'docx' – 2013-12-14 21:49:17
正確(duo to * antiword * limits),也許這個https://github.com/rainey/antiword-xp-rb/wiki是答案(雖然我沒有expierience到目前爲止) – xliiv 2013-12-15 17:15:10
MS Word中的較新版本的點綴ASCII [0]在每個文字的目的,我還無法理解的字母之間。我寫了我自己的MS Word搜索工具,它們在搜索字段中的每個字符之間插入ascii [0],並且它工作正常。笨拙,但確定。還有很多問題。也許垃圾角色並不總是相同的。需要做更多的測試。如果有人可以編寫一個將所有這些考慮在內的工具,那將會很好。在我的Windows機器上,相同的文件對搜索響應良好。 我們可以做到!
我是一名翻譯,並且幾乎完全不瞭解腳本,但我對於grep無法掃描Word內容感到非常惱火。doc文件,我制定瞭如何使這個小shell腳本使用catdoc和grep來搜索給定輸入字符串的.doc文件的目錄。
您需要安裝catdoc
和docx2txt
包
#!/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
所有的改進和建議表示歡迎!
這是非常令人印象深刻的。所以我可以搜索多個子文件夾和文件夾,看看裏面.doc - 我也會檢查.docx,雖然也.. – TheBlackBenzKid 2013-01-26 14:33:20
我添加了對docx2使用docx2txt的支持 – 2016-09-14 13:49:00
下面是使用「unzip」將全部內容打印到標準輸出,然後通過管道輸出到「grep -q」來檢測輸出中是否存在所需字符串的方法。它適用於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 [email protected]
do
unzip -p "$file" | grep -q "$findme"
[ $? -eq 0 ] && echo "$file"
done
腳本另存爲 「inword」,並在三個文件搜索 「袋熊」 有:
$ ./inword wombat file1.docx file2.docx file3.docx
file2.docx
現在你知道file2.docx包含 「袋熊」。您可以通過添加對其他grep選項的支持來獲得更好的效果。玩的開心。
非常方便,謝謝! – 2015-12-11 18:34:10
我遇到的最佳解決方案是使用unoconv
將word文檔轉換爲html。它也有一個.txt輸出,但在我的情況下,內容丟失。
的開源命令行實用程序crgrep將搜索最MS文檔格式(我是作者)。
要清楚,哪個版本的Word?文件格式從Office 2003到Office 2007顯着變化。 – 2012-07-12 23:31:15
@DanielDiPaolo我檢查了文件類型,它說'Microsoft Office Word 97 - 2003文檔' – JoshMachine 2012-07-12 23:32:37