LoginSignup
2
2

More than 3 years have passed since last update.

grepの出力をカンマで繋いで一行出力

Last updated at Posted at 2018-07-14

はじめに

Qiita初投稿です。緊張しますね。
表題のとおりの簡単な内容ですが、せっかくなので事例を交えて記事に残してみます。
なお、固有名詞については変えてます。

サーバー環境

CentOS release 6.9 (Final)

場面設定

とあるアプリケーションにこんなログがあるとします。

example.log
2018-07-14 00:00:01 [sample_job][success][target_id]1[value]100
2018-07-14 00:00:02 [sample_job][success][target_id]5[value]200
2018-07-14 00:00:03 [sample_job][error][target_id]10[value]300
2018-07-14 00:00:04 [sample_job][success][target_id]22[value]50
2018-07-14 00:00:05 [sample_job][error][target_id]14[value]780
2018-07-14 00:00:06 [sample_job][success][target_id]38[value]60
2018-07-14 00:00:07 [sample_job][success][target_id]7[value]450
2018-07-14 00:00:08 [sample_job][error][target_id]9[value]666
2018-07-14 00:00:09 [sample_job][error][target_id]45[value]777

こいつから

10,14,9,45

という結果をどうにかして取り出したい、というのが目的です。
ここではこれを SQL の WHERE 句に貼り付けて使いたいという用途でした。

その際にどんなコマンドを使って抽出したのかを記事にしてみたいとおもいます。

まず error の target_id だけを抽出

$ cat example.log | grep sample_job | grep error | awk -F [\]] '{print $4}' | awk -F [\[] '{print $1}'

うまく取り出せました。

10
14
9
45

カンマで繋いで一行で出力する

tr を使ってスペースを置換していますが、その前の xargs echo がポイントです。tr で改行コードをカンマに置換する手もありますが、このほうが改行コードの差異に悩まされないのでおすすめです。改行コードを直接置換する場合、CR、LF、CRLF全てを想定する必要があるため面倒臭いので。

$ (id取得までのコマンド) | xargs echo | tr ' ' ','

10,14,9,45

あとはこんなふうにSQLに貼り付けてDBへ問い合わせしたりします。

SELECT * FROM examples
WHERE id IN (10,14,9,45)

終わってみれば簡単な話なんですが、そういうものにかぎって意外と咄嗟には出てこないものですね:sweat:
もし似たような状況があればよかったら参考にしてください。

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2