今回はsipsで表示できるEXIF情報から必要な情報を取り出してみます。情報を取り出して取捨選択するのに便利なのがgrepです。findコマンドと組み合わせて使われることが多いgrepですが、今回は簡単なgrepの利用方法としてEXIF情報を元に画像ファイルを変換してみます。
grepってなに?
grep (global regular expression print) はテキストから指定された正規表現にマッチするテキストを抽出します。例えばパイプなどによって渡されたテキストやfindで検索したファイルやプロセスを出力するps、各種ログファイルなどから該当する文字があるかどうか調べる場合に使われます。grepは完全一致・部分一致検索だけでなく正規表現が使えるため、より高度なテキスト検索ができます。
grepは単独でも利用できますが、他のコマンドからの出力を利用するパイプと組み合わせると、より強力な処理を行うことができます。
今回はEXIF情報を検索するだけなので複雑な正規表現は使いません。まずは簡単なgrepの使い方からです。
grep単独でファイル内容を検索してみましょう。ここでは、いつものようにユーザーのデスクトップにsampleディレクトリを用意し、そこにファイルを用意しておきます。今回用意したファイル名と内容は以下の通りです。
・test1.txt
model:iPhoneSE
date:2021/7/21
・test2.txt
model:iPhoneSE2
date:2021/7/22
・test3.txt
model:iPHONE SE2
date:2021/7/22
・test4.txt
model:iPhoneXR
date:2021/9/1
・test5.txt
model:GalaxyS20
date:2021/9/1
・test6.txt
model:iPhoneSE
model:iPhoneSE2
model:iPhoneXR
model:Nexus One
date:2021/11/3
・test7.txt
model:iPhoneSE
model:GalaxyS20
model:REGZA PHONE
model:GalaxyS20
date:2022/2/22
それではgrepを使ってそれではgrepを使って簡単な文字の検索を行ってみましょう。まず、test1.txtにiPhoneの文字列があるかどうか検索してみます。grepでは以下のように指定します。test1.txtにはiPhoneの文字列があるのでマッチした行が出力(表示)されます。
grep iPhone test1.txt
今度は複数のiPhoneの文字があるtest6.txtで試してみましょう。以下のようにするとtest6.txtファイル内の検索が行われます。iPhoneの文字が含まれる行は全てマッチするのでiPhoneSE、iPhoneSE2、iPhoneXRがある行が表示されます。
grep iPhone test6.txt
今度はiPhoneの文字がないファイル(test5.txt)を検索してみます。以下のようにするとtest5.txtファイル内の検索が行われます。
grep iPhone test5.txt
test5.txtファイルにはiPhoneの文字がないので何も出力されません。
1つのファイルを検索するのではなく、まとめて検索することもできます。この場合、だいたい察しがつくと思いますが、以下のように指定します。この場合カレントディレクトリ内のテキストファイル(拡張子txtのファイル)の内容が検索されます。複数のファイルを検索した場合、ファイル名も出力されます。
grep iPhone *.txt
iPhoneの文字を検索しましたが、test3.txtはiPhoneの文字が大文字のためマッチしませんでした。大文字小文字を問わずに検索するにはオプションの-iを指定します。以下のようにするとtest3.txtもマッチするようになります。
grep -i iPhone *.txt
test3.txtはmodel:iPHONE SE2という文字列になっていますが、このiPHONE SE2にマッチさせるにはシングルクオートまたはダブルクオートで囲みます。というのも検索する文字列内に半角空白が含まれているからです。以下のようにするとカレントディレクトリにあるテキストファイル内からiPHONE SE2を含む文字列を検索します。
grep 'iPHONE SE2' *.txt
シングルクオートまたはダブルクオートで囲まないとどうなるのかというと以下のような結果になります。
grep iPHONE SE2 *.txt
grepはオプション指定の後に検索対象のファイル(ファイルパス)を複数指定できます。つまり以下のようにするとtest1.txt, test3.txt, test5.txtの3つのファイルからSEの文字を検索します。
grep 'SE' test1.txt test3.txt test5.txt
複数のファイルを検索対象にした場合、マッチした文字列の前にファイル名が表示されます。このファイル名は不要だという場合には-hのオプションを指定すると表示されなくなります。
grep -h 'SE' test1.txt test3.txt test5.txt