sedを使用してリスト変数から行を削除する

sedを使用してリスト変数から行を削除する

リストから単語を含む行を削除するためにループ内でsedを使用するスクリプトがあります。

for i in $list; do
  sed -i "/$i/d" file
done

$listSQLクエリから生成された:

list=$(psql -d dbname -t -c "SELECT foo from table ORDER BY column DESC")

問題は、当社が最近、全体またはfchownシステムfchmodコールを含む、より厳しい監査ルールを実装したことです。を使用すると、それぞれとシステムコールが含まれていることstraceがわかります。sed -ifchownfchmod

大きなリスト変数を使用すると、iowaitこのスパイクが劇的に増加し、auditdがログに膨大な数の行を記録するため、システムは実際に輻輳します。

ファイルが一度だけ開いて閉じるように、リスト変数を1行でsedに渡す方法があるかどうかを調べようとしています。

私は要求しましたが、 auditd ルールを変更できませんでした。

ありがとうございます。

ベストアンサー1

多数のインラインコマンドを1つずつ呼び出すのではなく、一度だけ実行してsed単一のスクリプトを使用するだけです。sed

sedscript=$(mktemp)
for i in $list; do
  echo "/$i/d" >> "$sedscript"
done
sed -f "$sedscript" -i /path/to/file
rm -f "$sedscript"

おすすめ記事