grepでファイルからシャープ(#)とセミコロン(;)と空白行を除いたものを取り出す

コメント(#や;)と空白を除いて出力したい場合があります。

$ grep -v -e '^;' -e '^#' -e '^\s*$' /etc/samba/smb.conf 
[global]
   workgroup = WORKGROUP
	server string = %h server (Samba, Ubuntu)
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = yes
[printers]
   comment = All Printers
   browseable = no
   path = /var/spool/samba
   printable = yes
   guest ok = no
   read only = yes
   create mask = 0700
[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no

こんな感じで↑いけます。

– 「’^;’」はセミコロンの行にマッチ
– 「’^#’」はシャープの行にマッチ
– 「’^\s*$’」は空白行にマッチ

です。

【ShellScript】MacOSでの自身のIPアドレス一覧の取得

ifconfigで表示させても見難いですよね。こんな感じでできます。ipv4だけを取得する例です。

$ LANG=C /sbin/ifconfig | grep -w inet | awk '{print $2;}'
127.0.0.1
192.168.1.108
192.168.2.1

これをシェルスクリプトで改行付きで表示するには、IFS (Internal field separator)というものを使えばいいようです。

ips.sh
IPS=(`LANG=C /sbin/ifconfig | grep -w inet | awk '{print $2}'`)
IFS=$'\n'
echo "${IPS[*]}"

実行例
$ sh ips.sh 
127.0.0.1
192.168.1.108
192.168.2.1

シェルスクリプト(Bash)の引数を正規表現で確認する方法

ときどきやりたくなり、そのたびに忘れるので書き残しておきます。

たとえば年の確認をしたい場合は、次のように書きます。
引数にダブルクオーテーションつけたり、正規表現の方にはダブルクオーテーションいらなかったりで混乱しがちですね。。。(他の言語だと正規表現は「/」で囲んだりしていますが。。。)

year.sh

#!/usr/bin/env bash

if [[ "$1" =~ ^20[0-9]{2}$ ]]; then
        echo "year"
else
        echo "not year"
fi

↑を実行してみます。

$ sh year.sh 2015
year

$ sh year.sh piyo
not year

$ sh year.sh 2015piyo
not year

良さそうな感じですね。

BashのProcess SubstitutionとWebAPI向けテストへの一考察

WebAPI(JSONが返ってくる感じのもの)のテストを簡単に書きたいなと思いまして、様々な言語やテストフレームワークを見ていたんですが、Bashで書けば書く方も読む方も楽かなと思いましていろいろとやってみましたらできそうな感じだったので記録に残しておきます。まあ知っている人にとっては極めて常識的な内容ですが、working exampleとして。。。

diff.sh

#!/usr/bin/env bash

diff <(echo "fuga") <(echo "{\"piyo\":\"fuga\", \"foo\":\"bar\"}" | jq -r '.piyo')

$ chmod +x diff.sh 
$ ./diff.sh
# 何も出ませんが、差分がないということなので、正常です。

↑こんな感じでBashのProcess Substitutionを使って、jqで一部分を取り出すことが出来ました。jqのオプションの-rは、raw outputという意味で、ダブルクオートなしで出力してくれます。WebAPIのテストでは、↑のechoでJSONを吐いている部分を、curlなどでWebAPIを叩く処理を書けば行けそうです。

注意点としては、

– shとして実行するとエラーが出ます。bashとして実行する必要があります。

また、初期値を設定してそれを参照したいところですが、↓のような感じで出来ます。

# ↓のようなファイルを作り、
$ vi users.txt 
$ cat users.txt 
EMAIL01=foo@example.com
PASSWORD01=secret_password
EMAIL02=bar@example.com
PASSWORD02=secret_p@ssword

# ↓さらにusers.txtを参照するスクリプトを作り
$ vi hoge.sh 
$ cat hoge.sh 
. ./users.txt
echo $EMAIL01
echo $PASSWORD01
echo $EMAIL02
echo $PASSWORD02

# 実行すると、users.txtに記述しておいた内容をシェルスクリプトで参照できます。
$ sh hoge.sh 
foo@example.com
secret_password
bar@example.com
secret_p@ssword

↑これで、username+passwordでログインするAPIを叩いたりできますね。