4

ここに私の設定ファイル (dansguardian-config) があります:

banned-phrase duck

banned-site allaboutbirds.org

この構成ファイルを読み取り、他のファイルを作成する bash スクリプトを作成したいと考えています。これが私がこれまでに持っているもので、ほとんどが疑似コードです:

while read line
do
    # if line starts with "banned-phrase"
        # add rest of line to file bannedphraselist
    # fi

    # if line starts with "banned-site"
        # add rest of line to file bannedsitelist
    # fi
done < dansguardian-config

grep、sed、awk、またはその他を使用する必要があるかどうかはわかりません。

それが理にかなっていることを願っています。私はDansGuardianのリストが本当に嫌いです。

4

6 に答える 6

4

あなたができる

sed -n 's/^banned-phrase *//p' dansguardian-config > bannedphraselist
sed -n 's/^banned-site *//p' dansguardian-config > bannedsitelist

それはファイルを2回読むことを意味しますが。ただし、パフォーマンスの低下の可能性が問題になるとは思えません。

于 2013-05-22T21:57:14.777 に答える
1

を使用するすべてのソリューションの問題は何echo text >> fileですか? straceそのようなすべてのステップで、ファイルがfile開かれ、最後に配置され、text書き込まれ、ファイルが閉じられることを確認できます。したがって、1000 回ある場合は1000にecho text >> fileなります。、およびの数は、次の方法で大幅に削減できます。openlseekwritecloseopenlseekclose

while read key val; do
  case $key in
  banned-phrase) echo $val>&2;;
  banned-site) echo $val;;
  esac
done >bannedsitelist 2>bannedphraselist <dansguardian-config

stdout と stderr はファイルにリダイレクトされ、ループが有効な間は開いたままになります。したがって、ファイルは一度開かれ、一度閉じられます。lseekは必要ありません。closeまた、不必要な への呼び出しが毎回バッファをフラッシュしないため、ファイル キャッシュはこの方法でより多く使用されます。

于 2013-05-22T23:21:48.023 に答える
0
while read name value
do
  if [ $name = banned-phrase ]
  then
    echo $value >> bannedphraselist
  elif [ $name = banned-site ]
  then
    echo $value >> bannedsitelist
  fi
done < dansguardian-config
于 2013-05-22T21:57:07.573 に答える