Git管理外のファイル間もしくはコマンド実行結果(標準入力)間での差分表示
Git管理のファイルであればデフォルトでもそれなりのdiff表示をしてくれるけどdiffコマンドで比較した場合どうするのが良いのかと思って調べた
Gitでのdiff表示に慣れてしまったためlinuxのdiff
コマンドで出力した結果には違和感というか見にくい感が…
ということでGit管理外のdiffを見やすくしてみます
- file1
line1 line2 line3 ho ge FuGa piyo line7 line8 Line9 line10
- file2
line1 line2 line3 hoge fuga piyo line7 line8 line9 line10
- diff
$ diff file1 file2 4,5c4,5 < ho ge < FuGa --- > hoge > fuga 9c9 < Line9 --- > line9
これはとりあえず見にくい…と思うのでオプションを付けます
- diff -u
$ diff -u file1 file2 --- file1 2019-11-17 23:59:55.787346336 +0900 +++ file2 2019-11-18 00:00:20.963514542 +0900 @@ -1,10 +1,10 @@ line1 line2 line3 -ho ge -FuGa +hoge +fuga piyo line7 line8 -Line9 +line9 line10
diff -u
でgit diffと似た感じの出力になります
これだけでも大分わかりやすくできた気がします
ここまでの手順で十分であればcolordiff
コマンドを入れて同様のオプションを渡してあげれば解決です
diff部分にハイライトをつける
diff-so-fancy
というコマンドに投げるとさらに見た目が変わります
diff -u file1 file2 | diff-so-fancy
so-fancy/diff-so-fancy: Good-lookin' diffs. Actually… nah… The best-lookin' diffs.
個人的にはこちらのほうが好みなのでここまでやりました
標準入力どうしのdiff
diff -u <(curl -XGET https://jsonplaceholder.typicode.com/todos/2) <(curl -XGET https://jsonplaceholder.typicode.com/todos/1) | diff-so-fancy
ちょっと例としては微妙ですがAPIのリクエスト結果を標準入力に入れてそれを比較に使うということもできます
- 参考
まとめ
なんでこんなこと調べたかと言うと「APIたたいた結果で差分取りたい」ということがあったからです
単にファイルどうしの比較であればvimdiffや各種エディタで差分を見ればよいのですが
「APIたたいて環境違いのソースコードを取得してきて差分がないか確認する」というのをサクッとやりたくて見てみたもののこの方法であれば色々応用できそうだなといまさらながら思いました
実際にはglueジョブのコードの差分を取れるように簡単なシェルスクリプトを書きました
- gluediff
#!/bin/bash get_glue_code(){ aws --profile=$1 s3 cp `aws --profile=$1 glue get-job --job-name $2 | jq -r '.Job.Command.ScriptLocation'` - } diff -u -w <(get_glue_code $1 $2) <(get_glue_code $1 $3) | diff-so-fancy
同じような要領でLambdaや他のマネージドサービスのコードを比較するみたいなこともできそうですね
まぁ…そもそもこんなことをしなくて良くなる環境にしていきたいところですが…