Quantcast
Channel: 俺的備忘録 〜なんかいろいろ〜
Viewing all 1028 articles
Browse latest View live

sedで改行を置換・削除する

$
0
0

sedでは、普通に「\n」を指定しただけだと改行の削除や置換を行うことができない。

20160709_185916000000

blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test1.txt
1.aaa
2.bbb
3.ccc
4.ddd
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test1.txt | sed 's/\n//g'
1.aaa
2.bbb
3.ccc
4.ddd

じゃ、どうしたら改行を置換できるのか。
GNU版のsedであれば、以下のようにすればいい。

sed ':a;N;$!ba;s/\n/ /g'
sed -z 's/\n/ /g'

20160709_190509000000

blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test1.txt
1.aaa
2.bbb
3.ccc
4.ddd
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test1.txt | sed 's/\n//g'
1.aaa
2.bbb
3.ccc
4.ddd
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test1.txt | sed ':a;N;$!ba;s/\n/ /g'
1.aaa 2.bbb 3.ccc 4.ddd
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test1.txt | sed -z 's/\n/ /g'
1.aaa 2.bbb 3.ccc 4.ddd

 

GNU版でない場合(Macとか)、以下のようにすればよい。

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'

 


agrep(tre-agrep)コマンドであいまい検索を行う

$
0
0

通常のgrepコマンドではあいまいな検索は行えないのだが、時折うろ覚えなキーワードでもgrepしてもらいたいこともある。
そんなときは、あいまい検索を行えるgrepとして『agrep』コマンドというものがある。

1.インストール

まずはインストールから。
以下のコマンドでインストールできる。

sudo yum install agrep # RHEL系
sudo apt-get install agrep # Debian/Ubuntu系

2.実際に使ってみる

それでは、実際にあいまい検索を行わせてみよう。
agrepコマンドは以下のように使用する。不一致の許容数を指定しない場合、完全一致したキーワードのみを抽出する。

agrep -不一致許容数 キーワード ファイルPATH
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test3.txt
abcdefg
abddefg #1文字違う
abcdefg
abcdr9g #2文字違う
2b3d4fg #3文字違う
[root@BS-PUB-CENT7-01 ~]# agrep abcdefg /tmp/test3.txt
abcdefg
abcdefg
[root@BS-PUB-CENT7-01 ~]# agrep -1 abcdefg /tmp/test3.txt
abcdefg
abddefg #1文字違う
abcdefg
[root@BS-PUB-CENT7-01 ~]# agrep -2 abcdefg /tmp/test3.txt
abcdefg
abddefg #1文字違う
abcdefg
abcdr9g #2文字違う
[root@BS-PUB-CENT7-01 ~]# agrep -3 abcdefg /tmp/test3.txt
abcdefg
abddefg #1文字違う
abcdefg
abcdr9g #2文字違う
2b3d4fg #3文字違う

 

「-B」オプションを使用すると、キーワードに一番近いと思われる行を抽出してくれる。

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test3.txt
abcdefg
abddefg #1文字違う
abcdefg
abcdr9g #2文字違う
2b3d4fg #3文字違う
[root@BS-PUB-CENT7-01 ~]# agrep -B abce /tmp/test3.txt
abcdefg
abcdefg
abcdr9g #2文字違う

 

その他のオプションについては、基本的にgrepコマンドと同じものが利用できる。

Mac/Ubuntuで使えるBSDのテキスト整形用ツール『rs』コマンドを使ってみる

$
0
0

ふとtwitterみてたら、rsコマンドなるものを使って処理しているものがあったので、ちょっと調べつつ使ってみることにした。
どうやらBSDで使われていたデータ処理のコマンドのようで、ちょっとしたバグはあるようだけど、いろんな使い道があるようだ。日本語のmanはこちら

一応Mac OS Xには最初から、Ubuntuには以下のコマンドでインストールすることができる。

sudo apt-get install rs

 

以下、いくつかの使い方をピックアップする。

1.複数の列に分割する

以前にこちらでも触れたのだが、pasteのように標準出力で受けた列を、複数の列に分割させることができる。

コマンド | rs 行数(0の場合無制限) 列数 # pasteと同じ方向で処理をする
コマンド | rs -t 行数(0の場合無制限) 列数 # pasteの逆の方向で処理をする

20160709_194901000000

blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10}
1
2
3
4
5
6
7
8
9
10
blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | paste - -
1       2
3       4
5       6
7       8
9       10
blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | rs 0 2
1   2
3   4
5   6
7   8
9   10
blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | rs -t 0 2
1   6
2   7
3   8
4   9
5   10

 

2.行と列を入れ替える

rsコマンドでは、「-T」オプションを付与することで、前にこちらでやったのと同じ処理を行える。

コマンド | rs -T

20160709_195441000000

blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | rs 0 3
1   2   3
4   5   6
7   8   9
10
blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | rs 0 3 | rs -T
1   4   7   10
2   5   8
3   6   9

3.要素を繰り返させる

複数列に分割させた際、もし要素が足りない場合は通常だと空欄になる。
しかし、「-y」オプションを付与するとその要素が足りない部分をループさせて表示させてくれる。

blacknon@BS-PUB-UBUNTU-01:~$ printf "%s\n" {a..z} | rs 0 10
a  b  c  d  e  f  g  h  i  j
k  l  m  n  o  p  q  r  s  t
u  v  w  x  y  z
blacknon@BS-PUB-UBUNTU-01:~$ printf "%s\n" {a..z} | rs 0 10 -y
a  b  c  d  e  f  g  h  i  j
k  l  m  n  o  p  q  r  s  t
u  v  w  x  y  z  a  b  c  d

 

4.区切り文字の指定

入力の区切り文字を「-c○」、出力の区切り文字を「-C○」で指定することができる。

blacknon@BS-PUB-UBUNTU-01:~$ printf "%s," {a..z} | rs 0 3
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,
blacknon@BS-PUB-UBUNTU-01:~$ printf "%s," {a..z} | rs -c, 0 3
a  b  c
d  e  f
g  h  i
j  k  l
m  n  o
p  q  r
s  t  u
v  w  x
y  z
blacknon@BS-PUB-UBUNTU-01:~$ printf "%s," {a..z} | rs -c, -C$ 0 3
a$b$c$
d$e$f$
g$h$i$
j$k$l$
m$n$o$
p$q$r$
s$t$u$
v$w$x$
y$z$

 

その他、以下のようなオプションがある。

  • -e … 渡された各行のデータを、すべて一つの配列の値とみなす
  • -k○ … 最初の○行は無視する
  • -K○ … 最初の○行は無視するが表示させる

結構いろいろなトコで使えそうなコマンドなので、有効に活用していきたい。

findで見つかったファイルをアーカイブ化・圧縮する

$
0
0

LinuxやMac OS Xを使っていると、findコマンドで取得したファイルをすべてアーカイブ化したり圧縮したりしたいことがある。
そんなときは、以下のようにすればよい。

1.tarでアーカイブ化する

GNU拡張のfindコマンドを使う場合

GNU拡張のfindコマンドを使っている場合、-execでtarコマンドを呼び出してやればよい。
ただ、ここでできるのはあくまでもアーカイブ化(一つのファイルにまとめる)ことだけで、圧縮(zip化)はできないという点。

find ファイルPATH <検索条件> -exec tar -rvf 作成するアーカイブファイルPATH {} \;
blacknon@BS-PUB-UBUNTU-01:~$ find /tmp -name "test*"
/tmp/test4.txt
/tmp/test3.txt
/tmp/test5.txt
/tmp/test123
/tmp/test456
/tmp/test.txt
/tmp/test1.txt
/tmp/test6.txt
/tmp/test2.txt
/tmp/test.csv
/tmp/test1.txt}
/tmp/test.pnm
blacknon@BS-PUB-UBUNTU-01:~$ find /tmp -name "test*" -exec tar rvf test.tar {} \;
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test4.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test3.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test5.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test123
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test456
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test1.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test6.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test2.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test.csv
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test1.txt}
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test.pnm
blacknon@BS-PUB-UBUNTU-01:~$ tar tvf test.tar
-rw-rw-r-- blacknon/blacknon 117 2016-07-09 17:28 tmp/test4.txt
-rw-rw-r-- blacknon/blacknon  53 2016-07-08 21:35 tmp/test3.txt
-rw-rw-r-- blacknon/blacknon 260 2016-07-09 19:13 tmp/test5.txt
-rw-rw-r-- blacknon/blacknon  25 2016-06-21 09:40 tmp/test123
-rw-rw-r-- blacknon/blacknon  26 2016-06-21 09:48 tmp/test456
-rw-rw-r-- blacknon/blacknon   0 2016-07-07 08:04 tmp/test.txt
-rw-rw-r-- blacknon/blacknon  24 2016-07-09 18:58 tmp/test1.txt
-rw-rw-r-- blacknon/blacknon  12 2016-07-09 19:46 tmp/test6.txt
-rw-rw-r-- blacknon/blacknon  28 2016-07-08 09:51 tmp/test2.txt
-rw-rw-r-- blacknon/blacknon 119 2016-07-09 23:21 tmp/test.csv
-rw-rw-r-- blacknon/blacknon   0 2016-06-05 17:16 tmp/test1.txt}
-rw-rw-r-- blacknon/blacknon 38609 2016-06-13 08:49 tmp/test.pnm

 

GNU拡張でないfindコマンドを使う場合

GNU拡張されていないfindコマンドを使う場合は、xargsを利用する。

find ファイルPATH <検索条件> -print0 | tar -cvf -T - --null -f 作成するアーカイブファイルPATH
BS-VPN-MAC-01:~ root# find /tmp/ -name "test*"
/tmp//test0
/tmp//test1
/tmp//test10
/tmp//test2
/tmp//test3
/tmp//test4
/tmp//test5
/tmp//test6
/tmp//test7
/tmp//test8
/tmp//test9
BS-VPN-MAC-01:~ root# find /tmp/ -name "test*" -print0 | tar -cvf test.tar --null -T -
tar: Removing leading '/' from member names
a tmp//test0
a tmp//test1
a tmp//test10
a tmp//test2
a tmp//test3
a tmp//test4
a tmp//test5
a tmp//test6
a tmp//test7
a tmp//test8
a tmp//test9
BS-VPN-MAC-01:~ root# tar tvf test.tar
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test0
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test1
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test10
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test2
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test3
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test4
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test5
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test6
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test7
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test8
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test9

2.圧縮ファイル(tar.gz)を作成する

さて、普通のアーカイブファイルだったらGNU拡張されているfindコマンドだとexecで呼び出せたのだが、圧縮させる場合だとちょっと難しい。
このため、xargs経由でtarにfindの結果を渡す必要がある。

find ファイルPATH <検索条件> -print0 | tar -czvf -T - --null -f 作成するアーカイブファイルPATH
blacknon@BS-PUB-UBUNTU-01:~$ find /tmp -name "test*"
/tmp/test4.txt
/tmp/test3.txt
/tmp/test5.txt
/tmp/test123
/tmp/test456
/tmp/test.txt
/tmp/test1.txt
/tmp/test6.txt
/tmp/test2.txt
/tmp/test.csv
/tmp/test1.txt}
/tmp/test.pnm
blacknon@BS-PUB-UBUNTU-01:~$ find /tmp -name "test*" -print0 | tar -czvf test.tar.gz --null -T -
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test4.txt
/tmp/test3.txt
/tmp/test5.txt
/tmp/test123
/tmp/test456
/tmp/test.txt
/tmp/test1.txt
/tmp/test6.txt
/tmp/test2.txt
/tmp/test.csv
/tmp/test1.txt}
/tmp/test.pnm
blacknon@BS-PUB-UBUNTU-01:~$ tar tzvf test.tar.gz
-rw-rw-r-- blacknon/blacknon 117 2016-07-09 17:28 tmp/test4.txt
-rw-rw-r-- blacknon/blacknon  53 2016-07-08 21:35 tmp/test3.txt
-rw-rw-r-- blacknon/blacknon 260 2016-07-09 19:13 tmp/test5.txt
-rw-rw-r-- blacknon/blacknon  25 2016-06-21 09:40 tmp/test123
-rw-rw-r-- blacknon/blacknon  26 2016-06-21 09:48 tmp/test456
-rw-rw-r-- blacknon/blacknon   0 2016-07-07 08:04 tmp/test.txt
-rw-rw-r-- blacknon/blacknon  24 2016-07-09 18:58 tmp/test1.txt
-rw-rw-r-- blacknon/blacknon  12 2016-07-09 19:46 tmp/test6.txt
-rw-rw-r-- blacknon/blacknon  28 2016-07-08 09:51 tmp/test2.txt
-rw-rw-r-- blacknon/blacknon 119 2016-07-09 23:21 tmp/test.csv
-rw-rw-r-- blacknon/blacknon   0 2016-06-05 17:16 tmp/test1.txt}
-rw-rw-r-- blacknon/blacknon 38609 2016-06-13 08:49 tmp/test.pnm

 

ログのアーカイブスクリプトとか、いろんなところで役に立つので、使い方は覚えておいたほうが良いだろう。

find + agrepコマンドでファイル名のあいまい検索を行う

$
0
0

時々、ファイル名やそのキーワードをちゃんと記憶してなくて、何を検索すればよいかもうろ覚えになってるときがある。
ただ、残念ながらfindコマンドではあいまい検索に対応しておらず、似たようなコマンドもなさそうだ。

そのため、ファイルのあいまい検索を行う場合は、findコマンドで指定したパス配下の内容をすべて出力させて、その内容をagrepであいまい検索させるのがよさそうだ。
以下、コマンドの実行例。

20160710_162007000000

blacknon@BS-PUB-UBUNTU-01:/tmp$ # testっぽい名前のファイルを探しているとする
blacknon@BS-PUB-UBUNTU-01:/tmp$ find ./ -type f | agrep -1 test
./test4.txt
./teat32
./teat1
./test3.txt
./test5.txt
./test123
./test456
./teat
./test.txt
./test1.txt
./test6.txt
./test2.txt
./test.csv
./test1.txt}
./test.pnm
blacknon@BS-PUB-UBUNTU-01:/tmp$ # testだけ除外する
blacknon@BS-PUB-UBUNTU-01:/tmp$ find ./ -type f | agrep -1 test | grep -v test
./teat32
./teat1
./teat

OpenStack上で作成したVMをKVMに移動する

$
0
0

会社で、OpenStack上に作成して動かしてたVMをKVMホストに移行させる必要があったので、備忘として残しておく。
といっても大したことは特に必要ない。以下の流れに沿って作業を行うだけだ。

1.OpenStack上でスナップショットを取得する

OpenStack上で、対象の仮想マシンのスナップショットを取得する。
これは、(OSのアップデート中とか高負荷状態でないなら)VMの動作中でも構わない。

スナップショットの取得も特殊なことは必要なく、普通にブラウザから対象のVMを選択してスナップショットの取得を行うだけだ。

 

2.スナップショットのデータ(仮想HDDデータ)を取得してKVMホストにコピーする

スナップショットが取得できたら、OpenStackのホストにsshで接続し、スナップショットのイメージファイルを抽出する。
まず、コマンドからのアクセス用の変数を入れたファイルを作成する。ファイル名は適当。

●keystonerc_admin

unset OS_SERVICE_TOKEN
export OS_USERNAME=<OpenStackのユーザ名>
export OS_PASSWORD=<OpenStackのユーザパスワード>
export OS_AUTH_URL=http://ホストのIPアドレス:5000/v2.0
export PS1='[\u@\h \W(keystone_admin)]\$ '

export OS_TENANT_NAME=<移行対象のVMがいるプロジェクト名>
export OS_REGION_NAME=RegionOne

 

ファイル作成後、読み込んで環境変数を設定する。

. ./keystonerc_admin

環境変数設定後、以下のコマンドでスナップショットの一覧を取得する。

nova image-list
[root@test ~(keystone_admin)]# nova image-list
+--------------------------------------+-----------------------------------+--------+--------------------------------------+
| ID                                   | Name                              | Status | Server                               |
+--------------------------------------+-----------------------------------+--------+--------------------------------------+
| 4c68f274-8beb-421e-bac9-8eb59a8b0fd4 | test_snapshot                     | ACTIVE | fa5c3dd2-94a8-4b25-b6a1-31b3e929d9e0 |
+--------------------------------------+-----------------------------------+--------+--------------------------------------+

 

移行対象となるVMのスナップショットのID(一番左のカラム)がわかったら、以下のコマンドでイメージを抽出する。

glance image-download --file 抽出後のHDDイメージ名 SnapshotのID

 

コマンド実行後、抽出されたHDDイメージをscpなどでKVMホストにコピーしてやればよい。

 

3.HDDデータを使ってVMを作成する

あとは、OpenStackから抽出時点でqcow2フォーマットになっているので、そのままKVM側でVMを作ってやればよい。

CentOS 7にブラウザベースのログモニタリングツール『log.io』を入れてみる

$
0
0

ログの監視について調べていたところ、ブラウザでSyslogを閲覧、フィルタリングすることができるモニタリングツール『log.io』なるものがあることを知ったので、試しに入れてみることにした。
今回は、CentOS 7にこのツールをインストールし、実際にアクセスしてみる。

ちなみに、こちらにデモページが用意されている。
インストール前に触ってみたい人は最初にこちらをいじってみた方がいいだろう。

1.インストール・起動

まずはインストールから。
npmでインストールできるので、以下のコマンドでインストールできる。

sudo yum install npm
sudo npm install -g log.io

 

『log.io』のインストール完了後、log.ioで読み込ませるログを設定する。
設定ファイル「~/.log.io/harvester.conf」を編集してやる。

例)

[root@BS-PUB-CENT7-01 ~]# cat ~/.log.io/harvester.conf
exports.config = {
  nodeName: "application_server",
  logStreams: {
    messages:
    [
        "/var/log/messages"
    ],
    secure:
    [
        "/var/log/secure"
    ],
    yum:
    [
        "/var/log/yum.log"
    ],
  },
  server: {
    host: '0.0.0.0',
    port: 28777
  }
}

 

最後に、以下のコマンドでサーバを起動させる。

log.io-server 2>/dev/null &
log.io-harvester 2>/dev/null &

 

これで、ブラウザからアクセスできるようになった。

2.Webブラウザからアクセスする

さて、それではWebブラウザからアクセスしてみよう。
「http://サーバのIPアドレス:28778」でアクセスできる。

初期表示だと何も表示されないのが、左メニューでログを表示させたい項目にチェックを入れてやればよい。

20160710_182609000000

 

設定ファイルでログのカテゴリを分けてやることで色分けしてくれるので、どういった内容のログなのか見分けがつきやすくなっている。
他のノードからのログはrsyslog側でファイル分けをしてやることで区別できそうだし、これは結構いいのではなかろうか。

今回はやっていないが、こちらをみると設定ファイルをいじることでユーザIDとパスワードによる認証も追加することができるようだ。

ファイルの圧縮方式に合わせて自動的に解凍してくれる『dtrx』コマンド

$
0
0

ネットサーフィンをしていたところ、tarやzip、rarなどファイルの圧縮方式に合わせて解凍をしてくれる『dtrx』コマンドなるものがあることを知ったので、試してみる。

1.インストール

以下のコマンドでインストールできる。

●RHEL系

wget http://brettcsmith.org/2007/dtrx/dtrx-7.1.tar.gz
tar -xvf dtrx-7.1.tar.gz
cd dtrx-7.1
python setup.py install --prefix=/usr/local

 

●Debian/Ubuntu系

sudo apt-get install dtrx

2.解凍する

さて、それでは実際に試してみよう。
使い方はいたって簡単。普通にオプション無しで対象のファイルPATHを指定してやると、カレントディレクトリ配下に解凍される。

dtrx ファイルPATH

20160710_214639000000

[root@BS-PUB-CENT7-01 dtrx_test]# ls -la
合計 6912
drwxr-xr-x. 2 root root    4096  7月 10 21:43 .
drwxrwxrwt. 8 root root    4096  7月 10 21:43 ..
-rw-r--r--. 1 root root  866400  7月 10 21:43 FL_insurance_sample.csv.zip
-rw-r--r--. 1 root root 1888720  7月 10 21:43 datamash-1.1.0.tar.gz
-rw-r--r--. 1 root root   41706  7月 10 21:43 dtrx-7.1.tar.gz
-rw-r--r--. 1 root root  876514  7月 10 21:43 mlr-4.1.0.tar.gz
-rw-r--r--. 1 root root   16210  7月 10 21:43 transpose-2.0.zip
-rw-r--r--. 1 root root 3370650  7月 10 21:43 v4.1.0.tar.gz
[root@BS-PUB-CENT7-01 dtrx_test]# dtrx datamash-1.1.0.tar.gz
[root@BS-PUB-CENT7-01 dtrx_test]# dtrx transpose-2.0.zip
[root@BS-PUB-CENT7-01 dtrx_test]# ls -la
合計 6916
drwxr-xr-x.  4 root root    4096  7月 10 21:44 .
drwxrwxrwt.  8 root root    4096  7月 10 21:44 ..
-rw-r--r--.  1 root root  866400  7月 10 21:43 FL_insurance_sample.csv.zip
drwxrwxr-x. 12 root root    4096  1月 17 07:53 datamash-1.1.0
-rw-r--r--.  1 root root 1888720  7月 10 21:43 datamash-1.1.0.tar.gz
-rw-r--r--.  1 root root   41706  7月 10 21:43 dtrx-7.1.tar.gz
-rw-r--r--.  1 root root  876514  7月 10 21:43 mlr-4.1.0.tar.gz
drwxr-xr-x.  4 root root      45 12月 22  2010 transpose-2.0
-rw-r--r--.  1 root root   16210  7月 10 21:43 transpose-2.0.zip
-rw-r--r--.  1 root root 3370650  7月 10 21:43 v4.1.0.tar.gz

 

確かに、zipファイルでもtar.gzでも特に指定もなく解凍させることができた。


ログなどでキーワードをハイライト表示させるのに便利なコマンド『rainbow』

$
0
0

先日紹介した『colout』と似たようなコマンドで、『rainbow』というコマンドがあるので今回はそれを触ってみる。

1.インストール

まずはインストール。
以下のコマンドを実行する。

git clone git://github.com/nicoulaj/rainbow.git
cd rainbow
sudo python setup.py install

2.使ってみる

インストールされたrainbowコマンドだが、基本的には以下のように使用する。

rainbow オプション -- 実行コマンド

 

使えるオプションには、特定の文字列に色を付けるものや太字にするもの、イタリックにするものなどいろいろある。
以下、色の変更をするオプションの抜粋。

文字の色を変える 文字の背景色を変える トグル
RED -r PATTERN
( –red=PATTERN )
-R PATTERN
(–bred=PATTERN )
–start-red=PATTERN ~
–reset-color=PATTERN まで
GREEN -g PATTERN
( –green=PATTERN )
-G PATTERN
(–bgreen=PATTERN )
–start-green=PATTERN ~
–reset-color=PATTERN まで
YELLOW -y PATTERN
( –yellow=PATTERN )
-Y PATTERN
(–byellow=PATTERN )
–start-yellow=PATTERN ~
–reset-color=PATTERN まで
BLUE -b PATTERN
( –blue=PATTERN )
-B PATTERN
(–bblue=PATTERN )
–start-blue=PATTERN ~
–reset-color=PATTERN まで
MAGENTA -m PATTERN
( –magenta=PATTERN )
-M PATTERN
(–bmagenta=PATTERN )
–start-magenta=PATTERN ~
–reset-color=PATTERN まで
CYAN -c PATTERN
( –cyan=PATTERN )
-C PATTERN
( –bcyan=PATTERN )
–start-cyan=PATTERN ~
–reset-color=PATTERN まで

 

色のほか、太字や下線、淡色、イタリックなども設定できる。

オプション内容 オプション トグル
太字 –bold=PATTERN –start-bold=PATTERN ~
–reset-intensity=PATTERN まで
淡色(淡い色) –faint=PATTERN –start-faint=PATTERN ~
–reset-intensity=PATTERN まで
イタリック –italic=PATTERN
下線 –underline=PATTERN
二重下線 –underline-double=PATTERN
点滅 –blink=PATTERN
–blink-rapid=PATTERN
ナビゲート –negative=PATTERN
強調しない –hide=PATTERN

 

試しに、適当に色を付けて実行した結果。

20160714_014006000000

 

これを見てると、状況に合わせていろいろな設定ができそうだ。

motd用のテキスト生成ツール『FireMotD』

$
0
0

以前、motdの内容を動的に変更させる方法について記述したことがあったが、その際に使えそうな『FireMotD』というものを見かけた。

1.インストール

まずはインストールから。
以下のコマンドで、前提となるパッケージを導入する。

●CentOSなどRHEL系

sudo yum install openssh-clients bc sysstat mpstat

 

●Debian/Ubuntu系

sudo apt-get install bc sysstat mpstat

 

前提となるパッケージを入れたら、以下のコマンドで『FireMotD』をインストールする。

git clone https://github.com/willemdh/FireMotD
cd FireMotD
sudo make install

 

これでFireMotDがインストールできた。

2.使ってみる

さて、インストールができたので実際に利用してみよう。
FireMotDは、基本的には以下のようにコマンドを実行する。

FireMotD -t テーマカラー

20160714_093829000000

 

あとは、定期的にこのコマンドを実行させて「/etc/motd」を書き換えさせるなどすればよい。

Linux/MacでCUIで複式簿記を扱える『Ledger』コマンド

$
0
0

ネットで調べものをしていたところ、コンソール上で複式簿記の記帳や計算のできるコマンド『Ledger』というものを見かけた。
結構昔からあるコマンドのようだが、今まで知らなかったので試しに使ってみることにする。一応、日本語での勘定項目の記述もできるようだ(ただ、残念ながら単位として日本円は使えなさそう…)。

これで家計簿をつける、というのもできそうだ。

1.インストール

インストールは簡単。
以下のコマンドで行える。

CentOSなどのRHEL系

yum install ledger

 

Debian/Ubuntu系

apt-get install ledger

 

Mac OS X

brew install ledger

 

これでインストールができた。

2.実際に使ってみる

それでは、実際に使ってみよう。様々な機能があるため、すべては把握しきれていない。
まず、『Ledger』では、.datファイルに独自フォーマットで勘定項目とその増減を記述してやり、それをledgerコマンドで読み込ませることでや損益計算書(PL)や貸借対照表(BS)を作成することができる。

記述する際のフォーマットは以下のようだ。

日付 .
    勘定項目(:で区切る)    金額
    ~省略~
    相手方の勘定項目(複数あるようならばそれぞれの項目ごとの金額を付与)

 

まず、サンプルとして以下のようなファイルを作成してみる。

●test.dat

2016/06/30 * 繰り越し残高
 資産:現金 200,000
 繰り越し残高

2016/06/30 * 給与
 資産:現金 200,000
 収入:給与

2016/07/01 * 食費
 経費:食料品 5,000
 資産:現金

 

貸借対象表(表にはなってないけど)のデータを出力する。

ledger -f /tmp/test.dat bal
[root@BS-PUB-CENT7-01 FireMotD]# cat /tmp/test.dat
2016/06/30 * 繰り越し残高
    資産:現金            200,000
    繰り越し残高

2016/06/30 * 給与
    資産:現金            200,000
    収入:給与

2016/07/01 * 食費
    経費:食料品          5,000
    資産:現金
[root@BS-PUB-CENT7-01 FireMotD]# ledger -f /tmp/test.dat bal
             -200000  収入:給与
                5000  経費:食料品
             -200000  繰り越し残高
              395000  資産:現金
--------------------
                   0
[root@BS-PUB-CENT7-01 FireMotD]# ledger -f /tmp/test.dat reg
16-Jun-30 繰り越し残高                           資産:現金                                                     200000                  200000
                                                 繰り越し残高                                                 -200000                       0
16-Jun-30 給与                                   資産:現金                                                     200000                  200000
                                                 収入:給与                                                    -200000                       0
16-Jul-01 食費                                   経費:食料品                                                     5000                    5000
                                                 資産:現金                                                      -5000                       0

 

うーん。。。
複式簿記の考え方とCUIへの慣れのためにはいいかもしれない。

ただ、勘定科目も自分で自由になるのは気楽ではありそうだけど、現金項目が固定で決まってないのでキャッシュフロー計算書(CF)は作れないっぽいし、どうなんだろうなぁ…

Google翻訳をLinux/Macのコンソール上で!『translate-shell』

$
0
0

LinuxやMacでCUIの操作をしていると、英語のドキュメントしかない場合が多い。
簡単な英語とか、ヘルプみたいな短文だったら問題ないが、疲れてるときに長文のドキュメントとか読む気にならないし、正直面倒くさい。

そんなときには、この『translate-shell』というコマンドが便利そうなので、ちょっと触ってみることにする。
このコマンド、簡単に説明するとGoogle翻訳をコンソール上から行ってくれる、というコマンドだ。

1.インストール

まずはインストールから。
以下のコマンドを実行する。

git clone https://github.com/soimort/translate-shell
cd translate-shell/
make && sudo make install

 

2.使ってみる

それでは、実際に使ってみよう。
英語→日本語のように、とりあえず日本語に翻訳する場合は、以下のように利用する。

trans :ja '文章'
[root@BS-PUB-CENT7-01 translate-shell]# trans :ja 'Hello World'
Hello World

こんにちは世界
(Kon'nichiwa sekai)

Translations of Hello World
[ English -> 日本語 ]

Hello World
    こんにちは世界, Hello Worldの, こんにちは, のHello World, たHello World

複数の言葉に翻訳する場合は、「:~+~」と記述してやればよい。

[root@BS-PUB-CENT7-01 translate-shell]# trans :fr+en 'こんにちわ'
こんにちわ
(Kon'nichiwa)

Bonjour

Translations of こんにちわ
[ 日本語 -> Francais ]

こんにちわ
    Bonjour

こんにちわ
(Kon'nichiwa)

Hello

Translations of こんにちわ
[ 日本語 -> English ]

こんにちわ
    Hello

 

自分で英文とか読むのが億劫なときに役に立ちそうだ。
Google翻訳なので、英語以外の文章の時でも活躍しそう。

awkで最後の行(最終行)のみ処理を行わせる

$
0
0

awkで、最後の行のみを出力して処理を行わせる場合、以下のようにすればよい。

awk 'END{処理内容}'
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt
1 aaaa
2 bbbb
3 cccc
4 dddd
5 eeee
6 ffff
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 最終行のみ表示
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt | awk 'END{print}'
6 ffff
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 最終行のみ表示させて置換
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt | awk 'END{gsub("f", "q");print}'
6 qqqq

他の行は普通に出力させ、最後の行だけに処理をさせる場合、ちょっと面倒くさい。
個人的に一番手っ取り早いと思う書き方としては、ifで判断できるよう、ファイル自体の行数を事前に取得させてしまう方法だろう。

awk -v eof=$(wc -l <ファイルPATH) '{if (NR==eof) 処理内容;else print $0}' ファイルPATH
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt
1 aaaa
2 bbbb
3 cccc
4 dddd
5 eeee
6 ffff
[root@BS-PUB-CENT7-01 ~]# awk -v eof=$(wc -l

sedでファイルの最初or最後の行に挿入(追記)する

$
0
0

Linuxで、root以外のユーザでOSの設定ファイルに追記しようとすると、リダイレクトの際にちょっと面倒な書き方をしなきゃいけなくて億劫。
で、sudoでやるならsedで書けるな、という点に気づいたので、備忘&忘れて検索したときに引っかかるよう残しておく。

sed '1i 文字列' ファイルPATH
sed '$a 文字列' ファイルPATH

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt
1 aaaa
2 bbbb
3 cccc
4 dddd
5 eeee
6 ffff
[root@BS-PUB-CENT7-01 ~]# sed '1i ABCDEFG' /tmp/test4.txt
ABCDEFG
1 aaaa
2 bbbb
3 cccc
4 dddd
5 eeee
6 ffff
[root@BS-PUB-CENT7-01 ~]# sed '$a ABCDEFG' /tmp/test4.txt
1 aaaa
2 bbbb
3 cccc
4 dddd
5 eeee
6 ffff
ABCDEFG

 

後は、対象のファイルに合わせて上書きオプション(-i)やsudoでの実行を行えばよい。

 

awkで2行目以降の行のみ処理を行う

$
0
0

awkで2行目以降の行のみで処理を行わせる場合、NR(awkで何行目かを認識する変数)を用いて、以下のようにすればよい。

awk 'NR>1{処理内容}'
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test.csv
id,user,value
1,aaa,1223
2,bbb,3333
3,ccc,855
4,ddd,998
5,eee,24354
6,fff,345
7,ggg,325
8,hhh,22
9,iii,4657
10,jjj,896
blacknon@BS-PUB-UBUNTU-01:~$ awk -F, 'NR>1{print $2}' /tmp/test.csv
aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii
jjj

1行目も出力させる場合は、ifと組み合わせてやればよい。

awk '{if (NR==1)print $0;else 2行目以降の処理}'
blacknon@BS-PUB-UBUNTU-01:~$ awk -F, '{if (NR==1)print $0;else print $2}' /tmp/test.csv
id,user,value
aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii
jjj

 


CentOS 7でGoogle Authenticatorによるワンタイムパスワードを用いたsshログイン時の二要素認証

$
0
0

家のサーバにて、テストとしてsshログイン時の二要素認証の設定をしたのでその備忘。
sshログイン時の二要素認証だと、Googleの提供している『Google Authenticator』を用いての設定が多いので、今回はそれで設定する。

なお、インストール先のOSはCentOS 7を用い、すでに鍵認証でのログイン設定は行われているものとする。

1.Google Authenticatorのインストール

まずは、以下のコマンドで『Google Authenticator』をインストールする上で前提となるパッケージを導入してやる。

sudo yum -y groupinstall "Development Tools"
sudo yum -y install pam-devel

 

次に、gitから『Google Authenticator』をダウンロード、コンパイルする。

cd /opt
git clone https://github.com/google/google-authenticator.git
cd google-authenticator/libpam
./bootstrap.sh
./configure
make && make install

 

これで、『Google Authenticator』のインストールが完了した。

2.sshdの設定変更

次に、sshで『Google Authenticator』での認証が行えるよう、設定を書き換えてやる。
まず、以下のコマンドを実行してビルドされたPAMモジュールを所定の位置にコピーする。

cd
cp /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security/

 

sshdの設定ファイル「/etc/ssh/sshd_config」を編集する。

sed -i -e '/^ChallengeResponseAuthentication/s/no/yes/g' /etc/ssh/sshd_config
echo "AuthenticationMethods publickey,keyboard-interactive" >> /etc/ssh/sshd_config

 

次に、Google Authenticatorで用いるPAMの設定ファイル「/etc/pam.d/google-auth」を作成する。

cat <<EOF > /etc/pam.d/google-auth
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_google_authenticator.so try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
EOF

 

作成後、sshdのPAM設定ファイルである「/etc/pam.d/sshd」に『Google Authenticator』のモジュールを読み込ませる設定を追記する。
この際、パスワード認証を今後させないのであれば「password-auth」の記述をコメントアウトするとよいだろう。

echo "auth       substack     google-auth" >> /etc/pam.d/sshd
sed -i.bk '/^auth.*password-auth/s/^/# /g' /etc/pam.d/sshd # 「password-auth」の記述をコメントアウトする場合

 

これで、sshdとそのpamまわりの設定が完了した。

3.Google Authenticatorの設定・準備

次に、『Google Authenticator』でsshログインするユーザでの設定を行う。
まず、事前にiPhoneやAndroidで『Google Authenticator』のアプリケーションをインストールしておく。

その後、以下のコマンドを『Google Authenticator』でsshログインするユーザで実行し、すべて「y」を選択していくだけだ。
※この際、最初に表示されるQRコードを『Google Authenticator』のアプリで読み取り、アカウントを登録してやる。

google-authenticator

20160719_081650000000

 

4.sshでログインする

さて、Google Authenticatorの設定ができたら、あとは実際にsshコマンドでログインするだけだ。
と言っても特別なことは必要ではなく、sshコマンドで普通に鍵認証orパスワードでログインを行うとワンタイムパスワードを求められるので、そこでアプリに表示されている数字6桁を入力してやるだけだ。

20160719_082531000000

 

これでログインができた。
なお、手元のTeratermから直接ログインできるものかやってみたが、普通にやった限りはログインできず、sshの踏み台となるサーバが必要になった。
鍵認証+チャレンジレスポンスが必要となるから、というのがあるかもしれない。

マクロと組み合わせればもしかしたら…と思うが、未検証。

awkで7桁以上の数字を科学表記法(指数表記)で表示させないようにする

$
0
0

awkでは、桁数が多い数字(小数点以下を含め、7桁以上)の出力を行うと、デフォルトだと科学表記法(10のべき乗。指数表記とも)で表示されてしまう。

[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" |awk '{print $1/$2}'
1.31337e+06

 

これは、awkでは、組み込み変数「OFMT」で返り値の書式を設定できるのだが、そのデフォルトが「%.6g(科学表記か浮動小数点、出力する文字数が少ない方を自動的に選択する)」となっているためだ。
つまり、コマンド実行の際に「OFMT」の設定をし直すか、もしくはprintfやsprintf処理時に書式を別途設定してやればよい。

1.OFMTを指定する

awkで、コマンド実行時にOFMTを別途指定してやる方法。
指定できる値の内容は以下。

  • %.6g … 科学表記法か浮動小数点表記法、いずれか文字数が少ない方(デフォルト)
  • %.Xe … 科学表記法で出力(Xは桁数)
  • %.Xf … 浮動小数点表記法で出力(Xは桁数。小数点以下が桁数以上は四捨五入)

 

つまり、科学表記法で出力したくないならば、OFMTを「%.Xf」で指定知れやればよい。

[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{print $1/$2}'
1.31337e+06
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # OFMTを「%.6g」に指定
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{OFMT="%.6g"} {print $1/$2}'
1.31337e+06
[root@BS-PUB-CENT7-01 ~]# echo "1000009550 1021" | awk '{OFMT="%.6g"} {print $1/$2}'
979441
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # OFMTを「%.6e」に指定
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{OFMT="%.6e"} {print $1/$2}'
1.313370e+06
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # OFMTを「%.6f」に指定
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{OFMT="%.6f"} {print $1/$2}'
1313370.105070

2.printf(sprintf)実行時に書式を指定する

OFMTと同じ指定方式で、awk内でprintfやsprintf実行時に書式を指定してやることもできる。
OFMTを指定できないような状況ならば、こちらで指定するのもよいだろう。

awk '{printf 書式, 値}' #printfの場合
awk '{$0=sprintf(書式, 値)}1' #sprintfの場合
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{printf "%.6f\n", $1/$2}'
1313370.105070
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{$0=sprintf("%.6f\n", $1/$2)}1'
1313370.105070

 

その他、細かい指定方法についてはこちらを参照するとよいだろう。

Ubuntu 16.04 LTSでGoogle Authenticatorによるワンタイムパスワードを用いたsshログイン時の二要素認証

$
0
0

前回、CentOS 7で『Google Authenticator』によるワンタイムパスワードの二重認証(二要素認証)について設定したので、今回はUbuntu 16.04 LTSでの設定。
といっても、基本的な設定方法は変わらないので、普通に進めていく。

なお、すでに公開鍵認証の設定は済んでいるものとする。

1.Google Authenticatorのインストール

まずは、『Google Authenticator』のインストール。
Ubuntuではapt-getでそのままインストールができる。以下のコマンドを実行する。

sudo apt-get install libpam-google-authenticator

 

これで、『Google Authenticator』のインストールができた。

 

2.sshdの設定変更

sshdの設定ファイル「/etc/ssh/sshd_config」を編集する。

sudo sed -i -e '/^ChallengeResponseAuthentication/s/no/yes/g' /etc/ssh/sshd_config
sudo sed -i "\$a AuthenticationMethods publickey,keyboard-interactive" /etc/ssh/sshd_config

 

次に、sshdのPAM設定ファイル「/etc/pam.d/sshd」を編集する。

sudo sed -i "\$a auth required pam_google_authenticator.so" /etc/pam.d/sshd

3.Google Authenticatorの設定・準備

最後に、以下のコマンドを実行し、iPhoneやAndroidから『Google Authenticator』のアプリを起動して表示されるQRコードを読み取ってアカウントを登録するだけだ。
表示される問いは、すべてyで構わない。

google-authenticator

 

これで設定は完了。sshdを再起動させる。

sudo service sshd restart

 

 

4.sshでログインする

後は、ふつうにsshでログインを実施するだけだ。

20160722_001044000000

 

awkで指定した列から後ろ全部を出力させる

$
0
0

awkで、指定した列から後ろの列すべてを出力させる場合、forで繰り返し処理をさせるのが楽だ。

awk '{c="";for(i=指定する列;i<=NF;i++) c=c $i" "; print c}'
blacknon@BS-PUB-UBUNTU-01:~$ head /tmp/test7.txt
aaaaa 123 test 1 2
bbbbb 123 test 2 2
ccccc 123 test 3 2
ddddd 123 test 4 2
eeeee 123 test 5 2
fffff 123 test 6 2
ggggg 123 test 7 2
hhhhh 123 test 8 2
iiiii 123 test 9 2
jjjjj 123 test 10 2
blacknon@BS-PUB-UBUNTU-01:~$ # 3列目以降をすべて出力する
blacknon@BS-PUB-UBUNTU-01:~$ awk '{c="";for(i=3;i<=NF;i++) c=c $i" "; print c}' /tmp/test7.txt
test 1 2
test 2 2
test 3 2
test 4 2
test 5 2
test 6 2
test 7 2
test 8 2
test 9 2
test 10 2
test 11 2
test 12 2
test 13 2

もしawkでなくてはいけない(他の処理も並行してやっている場合など)でなければ、cutを利用する方法もある。

cut -d' ' -f 指定列-
blacknon@BS-PUB-UBUNTU-01:~$ cut -d' ' -f 3- /tmp/test7.txt
test 1 2
test 2 2
test 3 2
test 4 2
test 5 2
test 6 2
test 7 2
test 8 2
test 9 2
test 10 2
test 11 2
test 12 2
test 13 2

 

awkで最後のフィールドのみ出力させる

$
0
0

awkで、最後の行の最後のフィールドのみを出力させる場合は、以下のようにすればよい。

awk 'END{print $NF}'

blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test7.txt
aaaaa 123 test 1 2
bbbbb 123 test 2 2
ccccc 123 test 3 2
ddddd 123 test 4 2
eeeee 123 test 5 2
fffff 123 test 6 2
ggggg 123 test 7 2
hhhhh 123 test 8 2
iiiii 123 test 9 2
jjjjj 123 test 10 2
kkkkk 123 test 11 2
lllll 123 test 12 2
mmmmm 123 test 13 last!
blacknon@BS-PUB-UBUNTU-01:~$ awk 'END{print $NF}' /tmp/test7.txt
last!

 

Viewing all 1028 articles
Browse latest View live