はじめに
ワンライナーとは一行のみで記述されたプログラムのことです。
今回はよく使うワンライナーを紹介していきます。
(この記事は備忘録も兼ねています)
「大量の文字列でファイルを検索したい!」
DBに格納してSQLで行うのは面倒という時におすすめ。
ワンライナーで同じことができます。
grepの活用で試してみる
単一の任意のファイルから検索文字列を取得し、別の指定ファイルに対して
一つずつ検索文字列でgrepするコマンド。
cat 検索文字列を含むファイル名 |xargs -I 'line' grep -r 'line' 検索したいファイル
検索したい文字列が沢山あり、
grep -e "文字列1" -e "文字列2" -e "文字列3" -e ……(以下略) 検索したいファイル
上記のように大量に検索文字列を指定したくない場合や、
grep -E '(検索文字列の一部1)(検索文字列の一部2|検索文字列の一部3)' 検索したいファイル
のような正規表現で対応出来ない場合に使えるコマンドです。
例えば、電話番号が3個記載されているファイル1と、
10個記載されているファイル2があるとします。
【ファイル1】
XXX-XXXX-XXX1
XXX-XXXX-XXX3
XXX-XXXX-XXX8
【ファイル2】
XXX-XXXX-XXX1
XXX-XXXX-XXX2
XXX-XXXX-XXX4
XXX-XXXX-XXX7
XXX-XXXX-XXX8
XXX-XXXX-XXX9
XXX-XXXX-XX10
XXX-XXXX-XX11
XXX-XXXX-XX13
XXX-XXXX-XX15
これらのファイルを利用して、
cat ファイル1 |xargs -I 'line' grep -r 'line' ファイル2
コマンドを実行すると
【出力結果】
XXX-XXXX-XXX1
XXX-XXXX-XXX8
となります。
検索文字列と検索したいファイルのレコード数が多ければ多いほど、
このコマンドは真価を発揮します。
ただし、検索したいファイルが1GB以上で検索文字列が数百超の場合は
あまりやらない方がいいです。(時間がかかるため)
さらに活用してみる
catの引数に複数ファイルを指定、もしくはワイルドカードを使用すれば、
複数の任意のファイルにも対応することができます。
cat ファイル1 ファイル2 ファイル3 ファイル4 |xargs -I 'line' grep -r 'line' 検索したいファイル
cat *.csv |xargs -I 'line' grep -r 'line' 検索したいファイル
catコマンドだけでなく、findやlsを使用するとサーチした複数のファイルにも
対応することができます。
find -name "*.csv" -type f |xargs cat |xargs -I 'line' grep -r 'line' 検索したいファイル
ls *.csv |xargs cat |xargs -I 'line' grep -r 'line' 検索したいファイル
lsではファイル数上限に引っかかる可能性があるため、findコマンドを使用することを勧めます。
……といっても上限に引っかかるほどのファイルで検索するのはオススメしませんが。
もちろんgrepコマンドに他のオプションを使用することも可能です。
例えば、
cat 検索文字列を含むファイル名 |xargs -I 'line' grep -r -i 'line' 検索したいファイル
であれば、検索文字列の大文字小文字は区別しないですし、
cat 検索文字列を含むファイル名 |xargs -I 'line' grep -r -n 'line' 検索したいファイル |sed -e "s/:/,/g"
であれば、検索し該当したレコードから項番を付与して出力します。
おわりに
ワンライナーは奥が深いです。
是非、自分だけのワンライナーを作成してみてください。