grep -o

表題の通り。メモである。

■ 環境

  • macOS High Sierra

■ grep

普段の使用方法としては、条件に合致もしくは合致しない行全体を表示することが多いのだが、正規表現で合致した文字列のみを抽出したかった。いつも通り合致した行から不要な部分を削除…という手段でいこうかと思ったのだが、`grep`の`man`を見てみるとちゃんとオプションがあるではないか。

-o, --only-matching
        Prints only the matching part of the lines.

実際にやってみると下記のようであった。試しにIPとおもわしき文字列を抽出してみる。

テストとして使うファイルは下記。accessログを模したものとする。

192.168.33.10 - - [15/May/2018:19:08:40 +0900] "GET /example/path HTTP/1.1" 404 1514 4795 "192.168.33.11" "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8)"
192.168.33.132 - - [15/May/2018:19:08:45 +0900] "GET /example/path2 HTTP/1.1" 302 - "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8)"

1行目に2つのIPアドレス、2行目に1つのIPアドレスが存在している。

$ grep -o -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' test.log
192.168.33.10
192.168.33.11
192.168.33.132
$

3つのIPアドレスが取得できた。満足である。

ちなみに正規表現では”[0-9]{1,3}“としてしまっているので、”001“や”999“といったIPアドレスではありえない数値であっても同様のフォーマットであれば取得してしまうが今回はそこまで厳密な用途ではないので良いものとする。

以上。

ipcalc

IPの整合性チェックをしたいと思い表題を試してみることにした。

■ 環境

  • maxOS High Sierra
  • Amazon Linux

■ ipcalc

`ipcalc`でできるよ。という話を聞いて早速試してみた。ローカルで動かすスクリプトのつもりなのでMacで動いて欲しい。

■ macOS High Sierra

$ brew search ipcalc
==> Searching local taps...
ipcalc                           sipcalc
==> Searching taps on GitHub...
==> Searching blacklisted, migrated and deleted formulae...
$

sipcalc“というものもあるのか、と思ってこちらも調べてみたのだが、”sipcalc“はSubnetを計算させるもののようなので今回やりたいことにマッチしない。というわけで”ipcalc“をインストールした。

$ brew install ipcalc

実行しようと思ったところ、イメージと違う…。

$ ipcalc -h
Usage: ipcalc [options] >address< [[/]<NETMASK>] [NETMASC]

ipcalc takes an IP address and netmask and calculates the resulting broadcast, 
network, Cisco wildcard mask, and host range. By giving a second netmask, you 
can design sub- and supernetworks. It is also intended to be a teaching tool 
and presents the results as easy-to-understand binary values. 

-n --nocolor Don't display ANSI color codes. 
-b --nobinary Suppress the bitwise output. 
-c --class Just print bit-count-mask of given address. 
-h --html Display results as HTML (not finished in this version). 
-v --version Print Version. 
-s --split n1 n2 n3 
        Split into networks of size n1, n2, n3. 
-r --range Deaggregate address range. 
   --help Longer help text. 

Examples: 

ipcalc 192.168.0.1/24 
ipcalc 192.168.0.1/255.255.128.0 
ipcalc 192.168.0.1 255.255.128.0 255.255.192.0 
ipcalc 192.168.0.1 0.0.63.255 

ipcalc >ADDRESS1< - >ADDRESS2< deaggregate address range 

ipcalc >ADDRESS</>NETMASK< --s a b c 
        split network to subnets where a b c fits in. 

! New HTML support not yet finished. 

ipcalc 0.41 
$

これもSubnetやNetworkアドレスの計算とかができるものであって、IPアドレスとして正しいものかのチェックはできなさそうである。下記のようにエラーメッセージを見ればできるが、戻り値も正常で返るし少々使い勝手が自身には良くない。

$ ipcalc 192.168.33.256
INVALID ADDRESS: 192.168.33.256

Address:   192.168.1.1          11000000.10101000.00000001. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.1.0/24       11000000.10101000.00000001. 00000000
HostMin:   192.168.1.1          11000000.10101000.00000001. 00000001
HostMax:   192.168.1.254        11000000.10101000.00000001. 11111110
Broadcast: 192.168.1.255        11000000.10101000.00000001. 11111111
Hosts/Net: 254                   Class C, Private Internet

$
$ echo $?
0
$

■ Amazon Linux

$ which ipcalc
/bin/ipcalc
$
$ rpm -qf /bin/ipcalc
initscripts-9.03.58-1.39.amzn1.x86_64
$
$ ipcalc -h
ipcalc: ip address expected
Usage: ipcalc [OPTION...]
  -c, --check         Validate IP address for specified address family
  -4, --ipv4          IPv4 address family (default)
  -6, --ipv6          IPv6 address family
  -b, --broadcast     Display calculated broadcast address
  -h, --hostname      Show hostname determined via DNS
  -m, --netmask       Display default netmask for IP (class A, B, or C)
  -n, --network       Display network address
  -p, --prefix        Display network prefix
  -s, --silent        Don't ever display error messages

Help options:
  -?, --help          Show this help message
  --usage             Display brief usage message
$

こっちがお目当の`ipcalc`であったようだ…。

$ ipcalc -c 192.168.33.256
ipcalc: bad IPv4 address: 192.168.33.256
$
$ ipcalc -c 192.168.33.255
$

Macではちょっと考えることにしよう。

以上。

■ 関連

Private IP Range 確認

zcat & gzcat

Macにおいて表題のコマンド。

■ 環境

  • macOS High Sierra

■ zcat

gzipで圧縮されたファイルを`zcat`で確認しようとしたところ下記のようになった。

$ zcat example.csv.gz
zcat: can't stat: example.csv.gz (example.csv.gz.Z): No such file or directory
$

なんでだろう?と思い確認。

$ file example.csv.gz
example.csv.gz: gzip compressed data, last modified: Sun Apr  1 18:10:01 2018, from Unix

特に問題なさそうであるのだが…。

$ zless example.csv.gz

`zless`では問題なく中身を確認することができた。

■ gzcat

調べていると、`gzcat`でやるべきとの記載を見つけ試してみる。

$ gzcat example.csv.gz

`gzcat`では思い通りの結果が得られた。これでパイプで他のコマンドに渡していろいろ処理をすることができる。

以上。

echoで表示する内容にタブ

表題の通り。知らなかったのでメモ。

■ 環境

  • sh

■ echo -e

スクリプトの中で情報を表示する際に`echo`で出すが、見栄えをよくする為に文字列の途中でタブを入れたかったので下記のようにやってみたところイメージと違う。

$ echo "aaa\tbbb"
aaa\tbbb
$

シングルクォートで括っているわけでもないのにな、と思っていたら制御文字を有効にするにはオプションが必要なようであった。

$ man sh
  :
 echo [-neE] [arg ...]
  Output  the  args,  separated  by  spaces, followed by a newline.  The return status is always 0.  If -n is
  specified, the trailing newline is suppressed.  If the -e option is given, interpretation of the  following
  backslash-escaped characters is enabled.  The -E option disables the interpretation of these escape charac-
  ters, even on systems where they are interpreted by default.  The xpg_echo shell  option  may  be  used  to
  dynamically determine whether or not echo expands these escape characters by default.  echo does not inter-
  pret -- to mean the end of options.  echo interprets the following escape sequences:
  \a     alert (bell)
  \b     backspace
  \c     suppress trailing newline
  \e     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  :
$

というわけで”-e“オプションをつけて再度実行する。

$ echo -e "aaa\tbbb"
aaa    bbb
$

思い通りの結果を得ることができた。

以上。

■ 関連

Macでの`echo -n`

SendGridAPI

表題を`curl`で実行したい。

■ 環境

  • SendGrid
  • Linux
  • Mac OSX El Capitan

■ SendGrid

下記の言語はライブラリが用意されている。

  • C#
  • Go
  • Java
  • NodeJS
  • PHP
  • Python
  • Ruby

今回は単なるシェルスクリプトの中で実行したかったので`curl`コマンドでメールを送りたい。

cURL Examples for Common Use Cases
https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/curl_examples.html

API KEYはSendGridの管理画面、『Settings > API Keys』から発行する。

https://app.sendgrid.com/settings/api_keys

発行したAPI KEYを下記の”YOUR_API_KEY“の箇所と置換する。

--header 'authorization: Bearer YOUR_API_KEY' \

Bearer “は削除していけない。

宛先や件名、本文は下記ドキュメントの『要求ボディパラメータ』を参照して編集した。

V3 Mail Send API 概要
https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/Mail/index.html

最終的には下記のようになった。

curl \
  --silent \
  --request POST \
  --url https://api.sendgrid.com/v3/mail/send \
  --header "Authorization: Bearer ${SENDGRID_APIKEY}" \
  --header 'Content-Type: application/json' \
  --data "${SENDGRID_REQUEST}"

本文や宛先は動的に生成したかったのと、別の場所で定義したかったのがあり”${SENDGRID_REQUEST}“変数に入れた。これでできたので満足。

以上。