grep -l

次のようなSQLが書かれたファイルがあって、その中から USERS テーブルに INSERT しているフィアルを検索する方法。

% cat sample01.sql    
-- USERS テーブルにインサートするよん
INSERT INTO USERS (id, name, age) VALUES (:ID, :NAME, :AGE)
% cat sample02.sql
SELECT * FROM USERS
% cat sample03.sql
UPDATE USERS SET name = :NAME WHERE id = :ID
% cat sample04.sql
INSERT INTO ORDER (user_id, product, count) INTO (:ID, :PROD, :COUNT)
% cat sample05.sql
DELETE FROM USERS WHERE id = :ID

こんな感じ?

% grep -l "USERS" *.sql | xargs grep "INSERT"
sample01.sql:INSERT INTO USERS (id, name, age) VALUES (:ID, :NAME, :AGE)

grep の l オプションは、マッチした行があれば以降の検索はしなくなり、出力はファイル名だけになる。l オプションを付けない場合この例だと sample01.sql が 2 行表示される。まあ、いいといえばいいんだけど。
ちなみに、今まではこの存在を知らずに次のようなコマンドを打っていた。

% grep "USERS" *.sql | cut -d: -f1 | uniq | xargs grep "INSERT"