かべぎわブログ

ブログです

Raspberry Pi で Google Home を喋らせてみる

Google HomeをRaspberry Piから喋らせてみたいと思います。

環境

  • Raspberry Pi 3 (raspbian v8.0)
  • Google Home (miniじゃないやつ)

手順

以下を参考にしました。

https://qiita.com/ktetsuo/items/8c9cd5714e231aa6ae09

古いNode.jsのアンインストール

$ sudo apt-get autoremove nodejs

nvmのインストール

nvmのディレクトリを作成して

$ sudo mkdir ~/.nvm
$ sudo chmod 777 ~/.nvm

git cloneでnvmをもってきて

$ git clone https://github.com/creationix/nvm.git ~/.nvm

nvm.shを読み込ませる。

$ source  ~/.nvm/nvm.sh

nvmがインストールできました!

$ nvm --version
0.33.8

新しいNode.jsのインストール

Node.jsのバージョンのリストを確認
(以下の出力はみやすいようにいらないやつを削っています)

$ nvm ls-remote
         v8.8.0
         v8.8.1
         v8.9.0   (LTS: Carbon)
         v8.9.1   (LTS: Carbon)
         v8.9.2   (LTS: Carbon)
         v8.9.3   (LTS: Carbon)
         v8.9.4   (LTS: Carbon)
->      v8.10.0   (Latest LTS: Carbon)
         v9.0.0
         v9.1.0

LTSの最新版であるv8.10.0をインストールしてみます。

$ nvm install v8.10.0

Node.jsがインストールできました!

$ node --version
v8.10.0

npmもインストールできているはずです。

$ npm --version
5.6.0

google-home-notifierのインストール

作業用ディレクトリ作成

$ mkdir googlehome
$ cd ./googlehome

npm initを実行してgooglehomeディレクトリでnpmを実行できるようにします。
いろいろ聞かれますが全部EnterでOKです。

$ npm init

avahiの開発用パッケージをインストールします。
内部でこれを利用しているようでインストールしておかないとエラーになります。

$ sudo apt-get install libavahi-compat-libdnssd-dev

満を持してgoogle-home-notifierのインストールです!!!

$ npm install google-home-notifier

実際にGoogle Homeをしゃべらせる

以下のスクリプトを配置します。

4行目のIPアドレスの部分は自分のGoogle HomeのIPアドレスに変更してみてください。

Google HomeのIPアドレスの確認するにはスマホのGoogle Homeアプリから
「デバイス」→IPアドレスを知りたいGoogleHome→「設定」の一番下にIPアドレスが記載されています。

スクリプトを実行すると実際に喋ります!

# node ./test.js

おわりに

今回は定型句を喋らせただけでしたが、なにかスクレイピングしてきてGoogleHomeから通知させるなど、夢が広がりますね!!! 

Windowsを使ってた人におくる僕が考えた最強のHHKB設定

長年WindowsでHHKBをつかっていたんだけど、Macに鞍替えするよみたいな人向けのHHKBの設定をご紹介します。

環境

  • HHKB Pro 2 US配列
  • Macbook 2017

設定内容

設定内容はこんなかんじです。

DIPスイッチ

背面のDIPスイッチは以下のような感じでMacintoshモードで、左の◇キーをFnキーに変更しています。

DIP SW ON/OFF
SW1 OFF
SW2 ON
SW3 OFF
SW4 ON
SW5 OFF
SW6 OFF

修飾キーの変更

「システム環境設定」→「キーボード」→「修飾キー」でControlキーとCommandキーを入れ替え

この設定をすることでWindowsとMacの最大の違いであるContorolキーとCommandキーの違いを感じさせずに使うことができます! (Windowsと同じキー配置でコピーペーストなどが可能になる) f:id:kabegiwakun:20180308204335p:plain

おわりに

参考になる人自分の他にいない感

PFU Happy Hacking Keyboard Professional BT 英語配列/墨 PD-KB600B

PFU Happy Hacking Keyboard Professional BT 英語配列/墨 PD-KB600B

Windowsインスタンスの停止時にログをS3に転送する

概要

Windowsインスタンスの停止時にS3にローカルのログファイルを転送する処理をご紹介します!

前提

  • Windows Server 2016
  • AWSCLIが利用可能な環境

シャットダウンスクリプトの設定手順

  • スタートメニューの「ファイル名を指定して実行」に「gpedit.msc」と入力してOK
  • コンピューターの構成→Windowsの設定→スクリプト(スタートアップ/シャットダウン)
  • シャットダウンをダブルクリック
  • 追加ボタンを押してスクリプト名に実行したいプログラムを設定

これでWindowsのシャットダウン時に指定のプログラムが実行されます。

基本的には以下URL見ればわかります。  

www.attrise.com

スクリプト例

こんなかんじのスクリプト(batファイル)をシャットダウンスクリプトに設定してあげればS3へログを転送することができます。
AWSCLIでS3にローカルのファイルをコピーしています。

aws s3 cp C:\Users\Administrator\Desktop\wawawa2.log s3://kabegiwa-bucket/wawawa.log

実行契機

以下の実行契機でシャットダウンスクリプトが実行されるようです。 - リモートデスクトップで接続して、スタートメニューから停止または再起動した場合 - マネジメントコンソールから、停止/再起動/削除した場合(削除は起動中のものを削除した場合のみ)

注意点

ただし、マネジメントコンソールから停止した場合と、スタートメニューから停止した場合では動きが少し異なっています。

スタートメニューから停止した場合はなにも考えなくても大丈夫ですが、 マネジメントコンソールからインスタンスを停止した場合、シャットダウンスクリプトの処理が長いと、停止時に問題が発生したとみなされてAWSから強制停止されてしまいます。

おわりに

終了時にログを退避することでインスタンスがいつ削除されてもいいようにしておくことがImmutableなインフラへの近道だと思います。
よくわかっていないですけれど…

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

  • 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: 単行本
  • この商品を含むブログを見る

handlersセクションではlistenを使うことで処理を複数個記載することができる

概要

さて、今回もAnsibleのhandlersセクションのおはなしです。
handlersセクションではタスクに更新(changed)があった場合にのみ実行することができるセクションです。

いままではhandlersには一つのタスクしか紐付けることができませんでしたが、Ansible ver2.2 からlistenを利用することでhandlersで複数のタスクを実行することができるようになりました!

playbook例

たとえば、以下のplaybookの場合、./temp/wawawa.txtにコピーを実行し、wawawa.txtに変化がった場合のみ、handlersmake_wawawa_filemake_wawawa_file2の処理が実行されます。

実際にやってみる

./temp配下になにもない状態のときは、以下のような実行結果になります。
RUNNING HANDLER [make_wawawa_file]が実行されていることがわかります。

$ ls -l ./temp/
total 0

$ ansible-playbook -i ansible_hosts handler.yml -v

PLAY [localhost] *******************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [localhost]

TASK [copy_file] *******************************************************************************************************************************************************************
changed: [localhost] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "./temp/wawawa.txt", "gid": 1000, "group": "ec2-user", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0664", "owner": "ec2-user", "size": 0, "src": "/home/ec2-user/.ansible/tmp/ansible-tmp-1520252948.16-195042225691797/source", "state": "file", "uid": 1000}

RUNNING HANDLER [make_wawawa_file] *************************************************************************************************************************************************
changed: [localhost] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "./temp/wawawa_result.txt", "gid": 1000, "group": "ec2-user", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0664", "owner": "ec2-user", "size": 0, "src": "/home/ec2-user/.ansible/tmp/ansible-tmp-1520252948.85-42002962767209/source", "state": "file", "uid": 1000}

RUNNING HANDLER [make_wawawa_file2] ************************************************************************************************************************************************
changed: [localhost] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "./temp/wawawa_result2.txt", "gid": 1000, "group": "ec2-user", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0664", "owner": "ec2-user", "size": 0, "src": "/home/ec2-user/.ansible/tmp/ansible-tmp-1520252949.29-14013734563506/source", "state": "file", "uid": 1000}

PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=4    changed=3    unreachable=0    failed=0 

つづけざまにもう一度コマンドを実行すると、wawawa.txtには変化はないので、以下のようにhundlersは実行されません。

$ ansible-playbook -i ansible_hosts handler.yml -v

PLAY [localhost] *******************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [localhost]

TASK [copy_file] *******************************************************************************************************************************************************************
ok: [localhost] => {"changed": false, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "gid": 1000, "group": "ec2-user", "mode": "0664", "owner": "ec2-user", "path": "./temp/wawawa.txt", "size": 0, "state": "file", "uid": 1000}

PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

おわりに

2日連続同じ記事感handlers

初めてのAnsible

初めてのAnsible

Ansibleでhandlersとnotifyをつかってみる

今回はAnsibleでhandlersnotifyを使って更新があった場合にのみ実行される処理をためしてみたいと思います。

handlersとは?

handlersとはchangedになった場合にのみ実行するタスクを記載できるセクションです。

playbook例

たとえば、以下のplaybookの場合、./temp/wawawa.txtにコピーを実行し、wawawa.txtに変化がった場合のみ、handlersmake_wawawa_fileの処理が実行されます。

実際にやってみる

./temp配下になにもない状態のときは、以下のような実行結果になります。
RUNNING HANDLER [make_wawawa_file]が実行されていることがわかります。

$ ls -l ./temp/
total 0

$ ansible-playbook -i ansible_hosts handler.yml -v

PLAY [localhost] *******************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [localhost]

TASK [copy_file] *******************************************************************************************************************************************************************
changed: [localhost] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "./temp/wawawa.txt", "gid": 1000, "group": "ec2-user", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0664", "owner": "ec2-user", "size": 0, "src": "/home/ec2-user/.ansible/tmp/ansible-tmp-1520252399.96-18679290845108/source", "state": "file", "uid": 1000}

RUNNING HANDLER [make_wawawa_file] *************************************************************************************************************************************************
changed: [localhost] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "./temp/wawawa_result.txt", "gid": 1000, "group": "ec2-user", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0664", "owner": "ec2-user", "size": 0, "src": "/home/ec2-user/.ansible/tmp/ansible-tmp-1520252400.64-10450162191451/source", "state": "file", "uid": 1000}

PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0   

つづけざまにもう一度コマンドを実行すると、wawawa.txtには変化はないので、以下のようにhundlersは実行されません。

$ ansible-playbook -i ansible_hosts handler.yml -v

PLAY [localhost] *******************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [localhost]

TASK [copy_file] *******************************************************************************************************************************************************************
ok: [localhost] => {"changed": false, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "gid": 1000, "group": "ec2-user", "mode": "0664", "owner": "ec2-user", "path": "./temp/wawawa.txt", "size": 0, "state": "file", "uid": 1000}

PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

おわりに

じゃっかん例がわるいようなきがしますけれど便利ですよhandlers

入門Ansible

入門Ansible

最大公約数を求めるLambda(Python3)

なんかまったく需要がなさそうだけど気の迷いでつくりました。

概要

変数のxyに整数を入力してあげると、printで結果を返してくれます。
以下のコードでは84と16の最大公約数を求めています。

かんたんな説明

最大公約数は以下のようにして求めることができます。

84 mod 16 = 4 
16 mod 4 = 0

あまりが0になったから最大公約数は4だ!!!!

84 mod 16を計算します。 答え(あまり)は4です。
つづいて、右辺の16と先程の答えの416 mod 4を計算します。
16 mod 4 = 0なので最大公約数は0です!!!

おわりに

説明下手感

Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ

Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ

IAMロールの権限でCyberduckを利用してS3とファイルをやりとりしてみる

今回はCyberduckというGUIのFTPクライアントツールを利用してAWS上のS3バケットとIAMロールを付与したWindowsインスタンス上でファイルのやり取りをしてみたいと思います。

この方法を利用することでアクセスキーを発行しなくてもCyberduckを利用することが可能です。

手順

以下の手順はすべてS3へアクセス可能なIAMロールがアタッチされているWindowsインスタンス内で作業していることを想定しています。

Cyberduckのダウンロード

以下からダウンロードできます。

https://cyberduck.io/index.ja.html?l=ja

S3のIAMロール用のCyberduckのprofileをダウンロード

IAMロール用のCyberduckのprofileをダウンロードしてきます。

以下のリンクの上のほうに「Connecting with temporary access credentials (Token) from EC2」という項目があります。
そこにIAMロール用のCyberduckのprofileがありますので、Downloadを選択して、ダウンロードします。

https://trac.cyberduck.io/wiki/help/en/howto/s3

画像でいうと赤枠のところ f:id:kabegiwakun:20180228185339p:plain

profileの編集

テキストエディタでダウンロードしてきたprofileを開き、 http://169.254.169.254/latest/meta-data/iam/security-credentials/s3accessとなっている箇所の、s3accessの部分を現在作業中のインスタンスにアタッチされているIAMロールの名前に書き換えます。
それ以外のところは、なにも編集せず保存します。

CyberduckでS3に接続してみる

さきほど編集したprofileをダブルクリックしてCyberduckを起動します。

すると、S3へ接続が行われ、バケットの一覧がでてきます。
f:id:kabegiwakun:20171101222245p:plain

バケット名をダブルクリックするとバケットの中身がみれます。
f:id:kabegiwakun:20171101222334p:plain

おわりに

アクセスキーを発行しなくてもこういったGUI系のツールを利用できる。というのは結構便利だと思います。
(AWSCLIつかいかたわからないみたいなこともあるので…)

おためしあれ!!!

サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス

サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス

ansible-docをつかってコンソールからmoduleの詳細を確認する

みなさんしってるかもしれませんが自分は知らなかったので展開します。

ansible-docsというコマンドがあります。
これを利用することでコンソールからコマンドで各moduleの詳細を確認することができます。
manみたいなかんじです。

実際にやってみる

たとえば以下のような感じです。
copyについて調べてみようと思います。

以下を実行すると…

$ ansible-doc copy

こんなかんじでcopymoduleの詳細を確認することができます。

> COPY    (/usr/lib/python2.7/site-packages/ansible/modules/files/copy.py)

        The `copy' module copies a file from the local or remote machine to a location on the remote machine. Use the [fetch] module to copy
        files from remote locations to the local box. If you need variable interpolation in copied files, use the [template] module. For Windows
        targets, use the [win_copy] module instead.

  * note: This module has a corresponding action plugin.

OPTIONS (= is mandatory):

- attributes
        Attributes the file or directory should have. To get supported flags look at the man page for `chattr' on the target system. This string
        should contain the attributes in the same order as the one displayed by `lsattr'.
        (Aliases: attr)[Default: None]
        version_added: 2.3

- backup
        Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered it incorrectly.
        [Default: no]
        type: bool
        version_added: 0.7

- content
        When used instead of `src', sets the contents of a file directly to the specified value. For anything advanced or with formatting also
        look at the template module.
        [Default: (null)]
        version_added: 1.1
~~~省略~~~

おわりに

ブラウザで公式ドキュメントを開く必要がなくなりますね!
おためしあれ!!!

入門Ansible

入門Ansible

AnsibleのホストパターンはAND(&)で指定ができる

AnsibleのホストパターンではAND条件で2つのグループに所属するノードのみを対象として実行することが可能です。

概要

例えば以下のような感じで:&で複数グループをつなげてあげます。

$ ansible -i ansible_hosts servers:&develop -m ping

このときインベントリファイルとして利用しているansible_hostsが以下のような内容のとき、serversかつdevelopである192.140.1.1にpingが実行されます。

[servers]
192.140.1.1
192.140.1.2

[develop]
192.140.1.1

[production]
192.140.1.2

実行結果

192.140.1.1にだけpingが実行されていることがわかります。

$ ansible -i ansible_hosts servers:&develop -m ping

192.140.1.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

おわりに

Ansibleのホストパターンは結構いろいろな指定の仕方をしてあげることが可能だったりします。
いろいろとためしてみたくださいね!!!

↓ちなみに以前紹介したやつはこちら

www.kabegiwablog.com

www.kabegiwablog.com

サーバ/インフラエンジニア養成読本 DevOps編 [Infrastructure as Code を実践するノウハウが満載! ] (Software Design plus)

サーバ/インフラエンジニア養成読本 DevOps編 [Infrastructure as Code を実践するノウハウが満載! ] (Software Design plus)

AnsibleでWindows上のzipファイルを展開する

今回はAnsibleでWindows上のzipファイルを展開してみようと思います。

概要

ターゲットのWindowsのtest.zipという名前のzipファイルを展開しています。
今回のplaybookではCドライブ直下においたzipファイルをデスクトップに展開しています。

実行コマンド

$ ansible-playbook -i ansible_hosts windows_unzip.yml

windows_unzip.yml

---
- hosts: target_host
  gather_facts: false

  tasks:
  - name: Unzip
    win_unzip:
      src: C:\test.zip
      dest: C:\Users\Administrator\Desktop\
...

おわりに

zipファイルを展開することができました。
zipにいろいろなものを圧縮してからAnsibleでコピー、展開することで一気に環境を構築することができるかもしれません。
(zipの中身がブラックボックス化するかもしれませんけれど…)

入門Ansible

入門Ansible

Windowsでコマンド一撃で大容量 空ファイルを作成する

Windows環境で一撃で大容量の空ファイルを作成する方法をご紹介します。

実行コマンド

コマンドプロンプトで以下を実行します。

fsutil file createnew C:\5gb_karafile.txt 5368709120

fsutilコマンドでCドライブ直下にファイルを作成しています。
5368709120は10進数で5Gbyteの意味です。

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

Ansibleでタグをつかって特定の処理のみ実行する

今回はAnsibleを利用して特定の処理だけを実行する方法をご紹介します。

playbookのいらないところをコメントアウトしていろいろためして…
みたいなことが不要になります!

概要

taskの中にtagsでタグをつけておいて、ansible-playbookコマンドの実行時に--tagsオプションでそのタグを指定してあげます。
すると、タグをつけた処理だけが実行できます!!!

かんたんな例

かんたんな例です。

playbook

playbookが以下だとします。

echoをファイルをリダイレクトするだけのかんたんなplaybookです。
それぞれtagsでwawawaとsasasaのタグをつけてあげています。

---
- hosts: localhost
  gather_facts: false
  tasks:
   - shell: echo "wawawa" > /home/ec2-user/wawawa.txt
     tags: wawawa

   - shell: echo "sasasa" > /home/ec2-user/sasasa.txt
     tags: sasasa
...

実行コマンド

オプションで--tagsを指定してタグがwawawaのものを実行してみます。

$ ansible-playbook -i ansible_hosts ec2_linux_tag_test.yml --tags wawawa

実行結果確認

標準出力は以下のとおり。

$ ansible-playbook -i ansible_hosts ec2_linux_tag_test.yml --tags wawawa
Using /etc/ansible/ansible.cfg as config file

PLAY [localhost] **************************************************************************************************

TASK [command] ****************************************************************************************************
changed: [localhost] => {"changed": true, "cmd": "echo \"wawawa\" > /home/ec2-user/wawawa.txt", "delta": "0:00:00.002605", "end": "2018-02-21 15:24:50.889019", "rc": 0, "start": "2018-02-21 15:24:50.886414", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0   

 
wawawa.txtだけが作成されていることがわかります。

$ cat /home/ec2-user/wawawa.txt 
wawawa

$ cat /home/ec2-user/sasasa.txt 
cat: /home/ec2-user/sasasa.txt: No such file or directory

おまけ

タグは以下のように実行コマンドで複数指定することも可能です。
--tags wawawa--tags sasasaを指定してあげています。

$ ansible-playbook -i ansible_hosts ec2_linux_tag_test.yml --tags wawawa --tags sasasa

また、playbook内のタグが一意である必要はないです。
今回の例の場合、両方ともtags: wawawaとしてあげることで両方とも処理が実行されます。  
たとえばplaybookが以下にような場合、両方の処理が実行されます。

$ cat ec2_linux_tag_test.yml
---
- hosts: localhost
  gather_facts: false
  tasks:
   - shell: echo "wawawa" > /home/ec2-user/wawawa.txt
     tags: wawawa

   - shell: echo "sasasa" > /home/ec2-user/sasasa.txt
     tags: wawawa
...

Ansible実践ガイド 第2版

Ansible実践ガイド 第2版

AnsibleでWindowsのショートカットを作成する

Ansibleを利用してWindowsにショートカットを作成してみます。

今回はためしにInternet Explorerのショートカットを作成してみようと思います。

実行コマンド

$ ansible-playbook -i ansible_hosts win_shortcut.yml

playbookは以下のようにしています。
Internet Explorerのショートカットをデスクトップ上に作成しています。

インベントリファイルは以下のようなかんじ。

[windows]
172.14.1.1

[windows:vars]
ansible_user=kabegiwa
ansible_password=wawawa
ansible_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

実行確認

Internet Explorerのショートカットが作成できました! f:id:kabegiwakun:20180221071155p:plain

 

初めてのAnsible

初めてのAnsible

diffで差分がないところだけ出力する

今回はdiffで差分がないところだけ出力してみます。

前提

比較するファイルは以下のようなものを用意しています。

$ cat foo.txt
AAAAA
BBBBB
CCCCC
$ cat bar.txt
CCCCC
DDDDD
EEEEE

実行コマンド

以下のコマンドでdiffで差分のない部分だけを出力することができます。

$ diff --old-line-format='' --unchanged-line-format='%L' --new-line-format='' foo.txt bar.txt
CCCCC

共通部分CCCCCだけが出力できました!

ちょっとした解説

diffにいろいろな長いオプションをつけていてよくわからないと思いますので解説していきます。
まず、今回はdiffのif-then-else形式と呼ばれる形式で差分を表示しています。
(-D--old-line-formatなどのオプションを指定してあげるとその形式になります。)

if-then-else形式とは以下のように比較結果を出力する形式です。

$ diff -D=test foo.txt bar.txt
#ifndef =test
AAAAA
BBBBB
#endif /* ! =test */
CCCCC
#ifdef =test
DDDDD
EEEEE
#endif /* =test */

続いてそれらで利用しているオプションの解説です。
--old-line-format=''は1番目のファイルだけにある行の出力のフォーマットを決めるオプションです。
これを''とすることで出力しないようにしています。

--new-file-format=''も同様です。
2番めのファイルの出力をしないように指定しています。

--unchanged-line-format='%L'は両方のファイルに共通な行を出力する際のフォーマットです。
%Lはman diff曰く

%L contents of line

とのことです。
行の内容をそのまま出力する。という意味で利用しています。

おわりに

共通部分を出力するだけなのにコマンドとしては少し長くなってしまいますが、シェルスクリプト内などで利用すると結構便利だったりするのではないでしょうか?

おためしください!!!

「シェル芸」に効く!AWK処方箋

「シェル芸」に効く!AWK処方箋