Skip to main content

1行のなかで複数パターン混在チェック

やりたいこと/前提

  • 1行のなかで、複数同じキーワードが出てくる
  • 対象ファイルはたくさんあり、手作業ミスでキーワードを間違えることがある
  • キーワード混在を検知したいが、そのためにスクリプトを書きたくない
  • そもそも 1行の中で複数同じキーワードが必要なこと自体、つくりが悪い、などとは考えないこととする

方法

grep でと思いきや、AWK でフィルタをする(もちろん grep で絞ってから AWK、の2段階でも良い)

bash
awk '/AAA/ + /BBB/ + ... > 1'  a.txt

→ /XXX/ が「マッチしたら 1、しなければ 0」となることを利用している。

これで、

  • AAA のみが存在したら 1 (なので表示されない)
  • AAA, BBB が混在したら 2 (なので表示される)

といった具合にキーワード混在した行が絞れる

データ例

フォルダ配下の crontab-*.txt というファイルに、以下のような記載があるとする

txt
0 7-23 * * 1-5 /path/to/script/xxx-Dev.sh  Dev  >> /path/to/log/xxx.Dev.log
0 7-23 * * 1-5 /path/to/script/xxx-UAT.sh UAT >> /path/to/log/xxx.UAT.log
0 7-23 * * 1-5 /path/to/script/xxx-Prod.sh Prod >> /path/to/log/xxx.UAT.log # <-- 誤り!

コマンド例

bash
find crontab/ -name 'crontab-*.txt' | xargs -r grep -nHE '(Dev|UAT|Prod)' | grep -v ':#' | awk '(/Dev/ + /UAT/ + /Prod/) > 1'

ついでに、結果表示を見やすくするためのポイント

  • grep -n で行番号表示
  • grep -H でファイル名を必ず表示(知るまで、引数に /dev/null 足してた。古典的)
  • ファイル名に空白は考慮しないこととした(あれば find ... -print0 | xargs -0 するだけではある)

以下広告