Linuxで特定の文字列が含まれない行を表示する方法の実務上の結論は「literal文字列の除外はgrep -vF、正規表現はgrep -vEを明示し、除外前後のline数とsampleを確認します。空patternでは実行を止めます。」です。除外処理はpatternへ一致しないlineを出す操作で、原本削除ではありません。まず一致lineを正方向でpreviewし、入力件数=保持件数+除外件数を検証します。
grep -vで除外条件を明示する
特定文字列を含まない行はgrep -vで表示できます。文字列をそのまま除外するなら-vF、正規表現なら-vEを使い、どの行を落とすかを正方向grepでも先に確認します。除外はdataを減らす操作なので、対象pattern、元行数、除外行数、残行数を記録し、原本を直接上書きしません。
grep -vF — ‘DEBUG’ fileはliteral除外、grep -vE — ‘^(DEBUG|TRACE)’は正規表現です。複数patternは-eを分け、空pattern fileや空文字列が全行除外を招かないか確認します。大文字小文字無視-iや単語境界-wは対象を変えるため、sampleと要件が一致する場合だけ追加します。
除外pattern・残件数・空pattern guardを定める
- literalかregexかを決める
- 除外patternが空でないことを検証する
- case sensitivityとlocaleを固定する
- 除外前後の期待件数を決める
空pattern、広すぎるregex、encoding不明の入力ではfilterを開始しません。rule ownerと期待除外件数を確認し、全件一致の可能性がある場合はreview用出力までで停止します。
正方向previewからgrep -vへ進む
固定文字列を含むlineを除外
grep -vF -- 'DEBUG' ./app.log
metacharacterを文字として扱うため-Fを使います。
複数literalを除外
grep -vF -e 'DEBUG' -e 'healthcheck' -- ./app.log
-eごとのpatternのいずれかへ一致するlineを除外します。
正規表現で除外
grep -vE -- '^[[:space:]]*(#|$)' ./config.txt
blank lineとcomment lineを対象にし、localeと期待sampleを確認します。
line番号付きでpreview
grep -nF -- 'DEBUG' ./app.log | head -n 20
除外前に消える候補を制限付きでreviewします。
別fileへ保存して件数比較
grep -vF -- 'DEBUG' ./app.log > ./app.filtered.log
wc -l -- ./app.log ./app.filtered.log
原本へ直接redirectせず、出力fileを別pathにします。
除外後の件数とstatusを読む
grep -vは各lineについて通常のmatch結果を反転します。空patternはすべてのlineへ一致するため、-vと組み合わせると通常何も選ばれません。終了code 0はselected lineあり、1はselected lineなし、2はerrorです。除外件数は入力line数との差だけでなくerrorも考慮します。
反転後に一行以上出れば通常status 0、出力が0行なら1、read/regex errorは2です。『全行が除外された』と『fileを読めなかった』を同じ空出力にしません。-cは残った行数を数えるので、除外行数を知るには正方向countも取得し、元行数との関係を確認します。context optionは除外用途の意味を曖昧にします。
empty pattern、shell quoting、正規表現meta文字、CRLF、UTF-8、binary、改行をまたぐrecord、header除外が典型です。grepはline単位なのでCSVのquoted multilineやJSON recordを安全にfilterできません。Permission deniedや途中truncateを0行と扱わず、stderrとstatusを保存します。除外条件が広すぎる場合は件数上限で停止します。
全行除外・0行入力・read errorを区別する
- 空patternで全lineを落とす
- literalをregexとして解釈する
- 原本と同じpathへredirectする
- grep終了code 1を実行errorとする
- 除外後dataを完全logとして監査へ使う
grep -vの空stdoutは全行除外、0行入力、read errorのいずれもあり得ます。statusとwc件数を保存し、恒等式が崩れたrunは候補fileを破棄してpattern previewからやり直します。
原本redirectを避け候補fileへ保存する
除外結果を原本へ同じredirectで書くとtruncateします。必ず別fileへ作成し、hash、line数、sample、permissionを検証します。security alertやaudit lineを広いpatternで消さず、除外条件のownerと期限を記録します。
grep -vのstdoutを原本と同じpathへredirectするとshellが先にtruncateするため禁止します。候補file、validate、atomicな置換、backupという変更workflowを別に設計します。security logの除外は監査証跡を失う可能性があるので、表示filterと保存retentionを混同せず、正本logを保持します。
誤削除を防ぐfixture
一致あり、なし、全line一致、空pattern、regex metacharacter、CRLF、binary、read errorをsample化します。入力・選択・除外件数と終了codeを表にし、原本hashが不変か確認します。
patternあり/なし、全行match、0行file、meta文字literal、複数pattern、header、CRLF、binary、read不可をfixtureにします。正方向grepの対象行、-vの残行、元/除外/残件数、status 0/1/2を期待表へ照合します。候補出力は別fileへ作り、line数とhashを確認してから利用します。
除外結果を別systemへ渡す場合は、元recordの識別子と除外理由を監査用manifestへ残します。機密行そのものを複製せず、必要ならhash、line番号、rule ID、処理時刻だけをaccess制御された場所へ保存します。rule更新前後で元件数、除外件数、残件数の恒等関係を確認し、急激な変化があれば配信を停止します。
除外rule版と件数恒等式を監視する
pipelineではproducerとgrep双方のstatusを取得し、grep 1を用途に応じて『残件なし』として扱います。処理前後のline数、byte数、除外pattern版をartifactへ保存します。pattern変更で残件が急減した場合は自動反映を止め、sample行とowner承認を求めます。formatが構造化されている場合はfield単位filterへ移行します。
表示filterと正本変換のworkflowを分ける
単純なtext lineのliteral除外は-vF、管理されたregexは-vE、構造化dataはparser、監査logは表示layerのqueryを選びます。除外後のfileを正本にする必要があるなら、単発commandではなくversion管理、schema validation、restore testを含む変換手順にします。
合格は0行、全行一致、一部一致、read不可fixtureで保持数と除外数が説明できることです。候補fileの確認後も原本は不変とし、正本置換は別承認workflowへ渡します。

コメント