2017-12-07 9 views
-1

私は基本的にワードリストファイルをとり、それが含むすべての行を別のリストと照合して、一致しない行を "uniques.txt"に出力するスクリプトをbashで作成しました。私は、これは非常にリソース集約的で、多くの時間がかかることがわかりました。私はコンピューターサイエンティストでもエンジニアでもないので、金属で何が起こっているのか本当に分かっていません。この問題のために "C"が偉大な言語であると聞きました...コードの一部:Bashスクリプトがリソースを大量に使用する

if [[ "$1" =~ ^\-i(.*)+$ ]]; then 
    echo "[*] Testing lines in \""$2"\" against \""$3"\"..." 
    for string in $(cat "$2"); do 
     if ! cat "$3" | grep -x "$string" &>/dev/null; then 
      echo "$string" >> uniques.txt 
     fi 
    done 
fi 

このスクリプトの使用例は、 "$ script" -i "$ wordlist" "$ wordlist_to check_against"です。あなたが反対$ 1と一致する正規表現は意味をなさない

johnson 
peter 
newyork 
amsterdam 

答えて

1

:のようにファイルの 内容は、間にはスペースを含む文字列、1行につき1つだろう。最初のパラメータは、-iで始まり、少なくとも1回繰り返されるもの(空の文字列を含む)が続きます。 ^-iと同じです。つまり、-iで始まります。

"in \""$2"\"が奇妙です。 $2は引用符で囲まれていません。つまり、空白が含まれていると名前が正しく表示されません(ファイルa ba bと表示されます)。

in $(catは、単語がファイルから1つずつ読み込まれることを意味します。つまり、$ 2に1行に複数の単語がある場合、それらは別々に一致します。

あなたはファイルからパターンを読み、遅さの原因となるループを避けるため grep -fを使用することができます

#! /bin/bash 
if [[ $1 =~ ^-i ]]; then 
    echo "[*] Testing lines in \"$2\" against \"$3\"..." 
    grep -vxf "$2" "$3" 
fi 
+0

は、ヘッドアップをありがとうございました。引用符をエスケープして、スクリプトの実行中に実際に表示しました。私は変数の周りにそれを置くだけで、それは文字列を考慮しないだろうか? – Dantalion

+0

私のスニペットは、スクリプト実行中に変数を二重引用符で囲んだままで表示する方法を示しています。 – choroba

+0

"grep -vxf"はうまくいきませんでした。 "grep:$ file(チェックしません):$ line:Unmatched [または[^" – Dantalion

関連する問題