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 確認

sudoedit

表題のコマンドを知ったのでメモ。

■ 環境

  • Amazon Linux
  • Ubuntu 16.04

■ sudoedit

`sudo vi`でファイルを編集するよりも`sudoedit`でファイルを編集する方が便利だ!という話を聞いた。

$ sudoedit example.log

なるほど確かにカレントユーザの`.vimrc`が読み込まれて適用されるようで、普段使用している環境ままに使えて便利である。

どのパッケージでインストールされるのか確認。

$ which sudoedit
/usr/bin/sudoedit
$
$ rpm -qf /usr/bin/sudoedit
sudo-1.8.6p3-29.27.amzn1.x86_64
$

同時にインストールされている様子。

$ rpm -ql sudo
  :
/usr/bin/sudo
/usr/bin/sudoedit
/usr/bin/sudoreplay
  :
/usr/sbin/visudo
  :

`sudoreplay`ってどういうコマンドだ?今度調べてみよう。

以上。

vim nowrap

表題の通り。たまに忘れるのでメモ。

■ 環境

  • Vim

■ nowrap

アクセスログ等、1行が長いファイルを`vim`で編集したい時に、改行されて行の全体が見えていると少々不便なこともある。よって改行されない状態でざっと見たい。

:set nowrap

これで思い通りの挙動をしてくれる。

以上。

cronで実行されるスクリプトのPATH

表題の通り。たまに忘れて実行エラーになるのでメモ。

■ 環境

  • Amazon Linux

■ PATH

`PATH`が通っていないので、`cron`から実行されるとコマンドが見つからない系のエラーで失敗してしまうことがある。

$ sudo su -
# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin
#

`cron`で実行されるときは下記しか`PATH`が通っていなかった。

/usr/bin:/bin

sbin“系のコマンドを使いたい時にいつもハマってしまう…。スクリプト内のコマンドは絶対PATHで書くものだと若い頃に師匠に教わったのをたまに忘れてる。

以上。