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するだけではある)
以下広告