[問題] 如何改進我的 shell 程式效率

看板Linux作者時間15年前 (2010/08/29 13:44), 編輯推噓7(7014)
留言21則, 6人參與, 最新討論串1/1
各位好, 我寫了一支 shell script, 目的在搜尋現行目錄所有 ".txt" 檔內的字串. 若 ".txt" 檔有我要的字串, 就把該字串的整行輸出到 result.txt. 因為我要搜尋字 串有很多, 就先把字串都寫入 strings.txt, 再用迴圈一個個的搜尋. ##################### 以下是我的 shell script ################################ string=`cat strings.txt` for file_name in `ls -F | grep ".txt"` do if [ $file_name != "strings.txt" ] && [ $file_name != "result.txt" ] then for name in $string do grep -w $name $file_name >> result.txt done fi done ##################### 以上是我的 shell script ################################ 但我後來發現, 這樣的寫法很沒有效率. 假設共有 5 個字串在 strings.txt 中, 則根據以上 script 的邏輯, 每個檔案都要被我搜尋 5 次去一一的找出每一個字串. 請問各位, 我該如何去改進這一點? 讓我的程式更有效率. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.252.195.55

08/29 15:12, , 1F
grep -e ?
08/29 15:12, 1F

08/29 15:19, , 2F
不是很懂你要的是? 一口氣搜尋5個字串?
08/29 15:19, 2F

08/29 15:32, , 3F
grep 一次可以吃不只一個file
08/29 15:32, 3F

08/29 15:40, , 4F
find -iregex '.*\.txt' -print0|grep -v strings.txt|
08/29 15:40, 4F

08/29 15:42, , 5F
grep -v result.txt| xrags -0 grep -w $name
08/29 15:42, 5F

08/29 15:43, , 6F
find -iregex '.*\.txt' -print0|grep -Zv strings.txt|
08/29 15:43, 6F

08/29 15:43, , 7F
grep -Zv result.txt| xrags -0 grep -w $name
08/29 15:43, 7F

08/29 16:00, , 8F
我想要一口氣搜尋5個字串 若第一個 file.txt 內的第一行有
08/29 16:00, 8F

08/29 16:01, , 9F
字串 A or B or C or D or E 則輸出第一行至 result.txt
08/29 16:01, 9F

08/29 16:03, , 10F
我的 script 是先搜尋A, 再搜尋B,..., 最後是E. 比較沒效率.
08/29 16:03, 10F

08/29 16:05, , 11F
我是初學, k 大的 code 我目前還看不懂, 但是謝謝你
08/29 16:05, 11F

08/29 16:14, , 12F
一口氣搜尋多個字串pattern的話 就用grep -e p1 -e p2
08/29 16:14, 12F

08/29 16:28, , 13F
謝謝, 但如果 string=(A B C D E)
08/29 16:28, 13F

08/29 16:29, , 14F
grep -we string >> reslut.txt 似乎沒有用, s大有好方法嗎?
08/29 16:29, 14F

08/29 16:51, , 15F
先設定你要的搜尋的字串清單 如果一個檔案內包含其中之一
08/29 16:51, 15F

08/29 16:55, , 16F
你可以針對每一行的內容 做五個字串的判斷
08/29 16:55, 16F

08/29 17:25, , 17F
http://tinyurl.com/2uvvhng 參考看看吧~應該是你要的
08/29 17:25, 17F

08/29 17:29, , 18F
至於string陣列要自己兜成餵給grep or egrep的參數才行
08/29 17:29, 18F

08/29 17:29, , 19F
小弟不才~只能想到這樣@@
08/29 17:29, 19F

08/29 17:42, , 20F
謝謝
08/29 17:42, 20F

08/30 11:47, , 21F
減少 pipeline, 甚至使用只有 bash 可用的語法.
08/30 11:47, 21F
文章代碼(AID): #1CUVEj4a (Linux)