SC2126: grep | wc -lの代わりにgrep -cを使用
grep | wc -lをより効率的なgrep -cに置き換え。シェルスクリプト向けの関連するパイプライン簡略化を解説します。
ShellCheck Patterns
詳細な説明
grep -c vs grep | wc -l
一般的なシェルスクリプトの習慣として、マッチする行を数えるためにgrepの出力をwc -lにパイプすることがあります。grepには組み込みの-c(カウント)フラグがあるため、これは不要です。
アンチパターン
# 不要なパイプライン
error_count=$(grep "ERROR" logfile.txt | wc -l)
修正方法
# 組み込みカウント
error_count=$(grep -c "ERROR" logfile.txt)
-cが優れている理由
- 2つではなく1つのプロセス: パイプとwcプロセスを排除
- 高速: カウントのみの場合、grepはマッチ内容の追跡を停止
- シンプル: 読みやすく理解しやすい
重要な違い
grep -cは行をカウントし、マッチ数ではありません。1行に複数回マッチしても1回とカウントされます:
echo "error error error" | grep -c "error" # 出力: 1
echo "error error error" | grep -o "error" | wc -l # 出力: 3
関連するパイプライン簡略化
| 非効率 | 効率的 |
|---|---|
| `grep pattern file | wc -l` |
| `cat file | grep pattern` |
| `grep pattern file | head -1` |
| `sort file | uniq` |
| `cat file | sort` |
マッチの存在チェック
# 悪い例: カウントして比較
if [ $(grep -c "ERROR" log.txt) -gt 0 ]; then
# 良い例: grep -q(quietモード、最初のマッチで終了)
if grep -q "ERROR" log.txt; then
echo "エラーが見つかりました"
fi
grep -qはパターンの存在チェックの最も効率的な方法です。最初のマッチ後に読み取りを停止します。
ユースケース
ログ分析スクリプト、モニタリングツール、ファイル内の出現回数をカウントするすべての自動化。スクリプトの効率性と読みやすさを改善するコードレビューにも有用です。