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

awkで行から数字のみを抜き出す

$
0
0

そういう処理について見かけたので、念のため残しておく。
awkで行に含まれる数字のみを抜き出すには、区切り文字として数字以外を指定して、各列を取得してやることで実現できる。

例えば、ファイルの各行に含まれている数字を1行づつ抽出する場合、以下のようにコマンドを実行する。

awk -F '[^0-9]+' '{for(i=1;i<=NF;i++){if($i!="")print $i}}' test1.txt
[root@BS-PUB-CENT7-01 ~]# cat test1.txt
111AAA222BBB333
CCC444DDD555EEE
666FFF777GGG888
[root@BS-PUB-CENT7-01 ~]# awk -F '[^0-9]+' '{for(i=1;i<=NF;i++){if($i!="")print $i}}' test1.txt
111
222
333
444
555
666
777
888

基本はこちらで良いと思うが、もし同じ行で数字だけを抽出するような処理をする場合、以下のように記述することもできる。

awk -F '[^0-9]+' 'BEGIN{OFS=""}{$1=$1;print $0}' test1.txt
[root@BS-PUB-CENT7-01 ~]# cat test1.txt
111AAA222BBB333
CCC444DDD555EEE
666FFF777GGG888
[root@BS-PUB-CENT7-01 ~]# awk -F '[^0-9]+' 'BEGIN{OFS=""}{$1=$1;print $0}' test1.txt
111222333
444555
666777888
[root@BS-PUB-CENT7-01 ~]# awk -F '[^0-9]+' 'BEGIN{OFS=","}{$1=$1;print $0}' test1.txt
111,222,333
,444,555,
666,777,888

 

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

『ssh_scan』でリモートサーバのsshdの状態をスキャンする

$
0
0

調べ物中、リモートサーバのsshdの設定情報をスキャンする『ssh_scan』なるツールについて見かけたので、試してみることにした。
以下のコマンドでインストールできる。

sudo gem install ssh_scan

 

オプション等はこんな感じ。

blacknon@BS-PUB-DEVELOP:~$ sudo ssh_scan --help
ssh_scan v0.0.19 (https://github.com/mozilla/ssh_scan)

Usage: ssh_scan [options]
    -t, --target [IP/Range/Hostname] IP/Ranges/Hostname to scan
    -f, --file [FilePath]            File Path of the file containing IP/Range/Hostnames to scan
    -T, --timeout [seconds]          Timeout per connect after which ssh_scan gives up on the host
    -L, --logger [Log File Path]     Enable logger
    -O, --from_json [FilePath]       File to read JSON output from
    -o, --output [FilePath]          File to write JSON output to
    -p, --port [PORT]                Port (Default: 22)
    -P, --policy [FILE]              Custom policy file (Default: Mozilla Modern)
        --threads [NUMBER]           Number of worker threads (Default: 5)
        --fingerprint-db [FILE]      File location of fingerprint database (Default: ./fingerprints.db)
        --suppress-update-status     Do not check for updates
    -u, --unit-test [FILE]           Throw appropriate exit codes based on compliance status
    -V [STD_LOGGING_LEVEL],
        --verbosity
    -v, --version                    Display just version info
    -h, --help                       Show this message

Examples:

  ssh_scan -t 192.168.1.1
  ssh_scan -t server.example.com
  ssh_scan -t ::1
  ssh_scan -t ::1 -T 5
  ssh_scan -f hosts.txt
  ssh_scan -o output.json
  ssh_scan -O output.json -o rescan_output.json
  ssh_scan -t 192.168.1.1 -p 22222
  ssh_scan -t 192.168.1.1 -p 22222 -L output.log -V INFO
  ssh_scan -t 192.168.1.1 -P custom_policy.yml
  ssh_scan -t 192.168.1.1 --unit-test -P custom_policy.yml

とりあえず、以下のように「-t」オプションを付与してスキャン対象のIPアドレスやホスト名を指定してコマンドを実行してやれば、sshの設定についてスキャンを実施できる。
スキャン結果は、以下のようにJSON形式で返ってくる。

sudo ssh_scan -t IPアドレス
blacknon@BS-PUB-DEVELOP:~$ sudo ssh_scan -t 172.20.XXX.XXX
[sudo] blacknon のパスワード:
I, [2017-04-21T07:50:42.069285 #31650]  INFO -- : You're using the latest version of ssh_scan 0.0.19
[
  {
    "ssh_scan_version": "0.0.19",
    "ip": "172.20.XXX.XXX",
    "port": 22,
    "server_banner": "SSH-2.0-OpenSSH_6.6.1",
    "ssh_version": 2.0,
    "os": "unknown",
    "os_cpe": "o:unknown",
    "ssh_lib": "openssh",
    "ssh_lib_cpe": "a:openssh:openssh:6.6.1",
    "cookie": "855e7a15ae96eb8f7f2c50b2aa1ba980",
    "key_algorithms": [
      "curve25519-sha256@libssh.org",
      "ecdh-sha2-nistp256",
      "ecdh-sha2-nistp384",
      "ecdh-sha2-nistp521",
      "diffie-hellman-group-exchange-sha256",
      "diffie-hellman-group-exchange-sha1",
      "diffie-hellman-group14-sha1",
      "diffie-hellman-group1-sha1"
    ],
    "server_host_key_algorithms": [
      "ssh-rsa",
      "ecdsa-sha2-nistp256",
      "ssh-ed25519"
    ],
    "encryption_algorithms_client_to_server": [
      "aes128-ctr",
      "aes192-ctr",
      "aes256-ctr",
      "arcfour256",
      "arcfour128",
      "aes128-gcm@openssh.com",
      "aes256-gcm@openssh.com",
      "chacha20-poly1305@openssh.com",
      "aes128-cbc",
      "3des-cbc",
      "blowfish-cbc",
      "cast128-cbc",
      "aes192-cbc",
      "aes256-cbc",
      "arcfour",
      "rijndael-cbc@lysator.liu.se"
    ],
    "encryption_algorithms_server_to_client": [
      "aes128-ctr",
      "aes192-ctr",
      "aes256-ctr",
      "arcfour256",
      "arcfour128",
      "aes128-gcm@openssh.com",
      "aes256-gcm@openssh.com",
      "chacha20-poly1305@openssh.com",
      "aes128-cbc",
      "3des-cbc",
      "blowfish-cbc",
      "cast128-cbc",
      "aes192-cbc",
      "aes256-cbc",
      "arcfour",
      "rijndael-cbc@lysator.liu.se"
    ],
    "mac_algorithms_client_to_server": [
      "hmac-md5-etm@openssh.com",
      "hmac-sha1-etm@openssh.com",
      "umac-64-etm@openssh.com",
      "umac-128-etm@openssh.com",
      "hmac-sha2-256-etm@openssh.com",
      "hmac-sha2-512-etm@openssh.com",
      "hmac-ripemd160-etm@openssh.com",
      "hmac-sha1-96-etm@openssh.com",
      "hmac-md5-96-etm@openssh.com",
      "hmac-md5",
      "hmac-sha1",
      "umac-64@openssh.com",
      "umac-128@openssh.com",
      "hmac-sha2-256",
      "hmac-sha2-512",
      "hmac-ripemd160",
      "hmac-ripemd160@openssh.com",
      "hmac-sha1-96",
      "hmac-md5-96"
    ],
    "mac_algorithms_server_to_client": [
      "hmac-md5-etm@openssh.com",
      "hmac-sha1-etm@openssh.com",
      "umac-64-etm@openssh.com",
      "umac-128-etm@openssh.com",
      "hmac-sha2-256-etm@openssh.com",
      "hmac-sha2-512-etm@openssh.com",
      "hmac-ripemd160-etm@openssh.com",
      "hmac-sha1-96-etm@openssh.com",
      "hmac-md5-96-etm@openssh.com",
      "hmac-md5",
      "hmac-sha1",
      "umac-64@openssh.com",
      "umac-128@openssh.com",
      "hmac-sha2-256",
      "hmac-sha2-512",
      "hmac-ripemd160",
      "hmac-ripemd160@openssh.com",
      "hmac-sha1-96",
      "hmac-md5-96"
    ],
    "compression_algorithms_client_to_server": [
      "none",
      "zlib@openssh.com"
    ],
    "compression_algorithms_server_to_client": [
      "none",
      "zlib@openssh.com"
    ],
    "languages_client_to_server": [

    ],
    "languages_server_to_client": [

    ],
    "hostname": "",
    "auth_methods": [
      "publickey",
      "gssapi-keyex",
      "gssapi-with-mic",
      "password"
    ],
    "fingerprints": {
      "rsa": {
        "known_bad": "false",
        "md5": "bd:63:c3:f3:df:6e:fc:e7:cf:d9:ef:d7:92:98:a0:06",
        "sha1": "4c:49:90:17:68:3a:ac:3a:55:d2:8a:66:98:7a:bc:31:76:60:20:d2",
        "sha256": "21:8e:20:74:57:f9:e2:76:b7:43:69:e5:81:55:04:33:40:58:81:be:ce:04:77:b1:97:b3:7f:c5:3c:25:2d:3a"
      }
    },
    "start_time": "2017-04-21 07:50:42 +0900",
    "end_time": "2017-04-21 07:50:42 +0900",
    "scan_duration_seconds": 0.192282261,
    "duplicate_host_key_ips": [

    ],
    "compliance": {
      "policy": "Mozilla Modern",
      "compliant": false,
      "recommendations": [
        "Remove these Key Exchange Algos: diffie-hellman-group-exchange-sha1, diffie-hellman-group14-sha1, diffie-hellman-group1-sha1",
        "Remove these MAC Algos: hmac-md5-etm@openssh.com, hmac-sha1-etm@openssh.com, umac-64-etm@openssh.com, hmac-ripemd160-etm@openssh.com, hmac-sha1-96-etm@openssh.com, hmac-md5-96-etm@openssh.com, hmac-md5, hmac-sha1, umac-64@openssh.com, hmac-ripemd160, hmac-ripemd160@openssh.com, hmac-sha1-96, hmac-md5-96",
        "Remove these Encryption Ciphers: arcfour256, arcfour128, aes128-cbc, 3des-cbc, blowfish-cbc, cast128-cbc, aes192-cbc, aes256-cbc, arcfour, rijndael-cbc@lysator.liu.se",
        "Remove these Authentication Methods: gssapi-keyex, gssapi-with-mic, password"
      ],
      "references": [
        "https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
      ]
    }
  }
]

 

OpenSSH[実践]入門 (Software Design plus) OpenSSH[実践]入門 (Software Design plus)

第28回シェル芸勉強会に参加してきました(復習)

$
0
0

第28回シェル芸勉強会に行ってきたので、その復習。
今回はLaTeXのファイルに対して、特定箇所の抽出やらを行っていく形式。正直、かなり難しかった…。前回もそうだったけど、ほとんどついていけなかった。よくわからなかったトコについては、回答できた人の内容を分解して理解を進めることにする。
問題および模範解答はこちら。問題で使用するファイルは、(1ファイルしかないけど)以下のコマンドでダウンロードすると良いだろう。

git clone https://github.com/ryuichiueda/ShellGeiData.git

 

Q1.

まずはQ1。これは簡単で、それぞれ以下のように回答できる。
sedでもいけるけど、とりあえずawk。

Q1-1

awk '/\\begin{figure}/,/\\end{figure}/' contents.tex
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ awk '/\\begin{figure}/,/\\end{figure}/' contents.tex
\begin{figure}[htbp]
        \begin{center}
                \includegraphics[width=0.5\linewidth]{./figs/coordinate.eps}
                \caption{世界座標系とロボットの姿勢}
                \label{fig:coordinate}
        \end{center}
\end{figure}
\begin{figure}[htbp]
        \begin{center}
                \includegraphics[width=0.5\linewidth]{./figs/observation.eps}
                \caption{計測値}
                \label{fig:observation}
        \end{center}
\end{figure}
\begin{figure}[htbp]
        \begin{center}
                \includegraphics[width=0.5\linewidth]{./figs/two_poses.eps}
                \caption{ランドマークの計測値から2点の相対姿勢を求める}
                \label{fig:two_poses}
        \end{center}
\end{figure}
\begin{figure}[htbp]
        \begin{center}
                \includegraphics[width=0.8\linewidth]{./figs/observation_noise.eps}
                \caption{ランドマークの計測値の不確かさを表す共分散行列}
                \label{fig:observation_noise}
        \end{center}
\end{figure}

 

Q1-2

Q1-1の内容をベースに、以下のようにコマンドを実行する事で回答できる。

awk '/\\begin{figure}/,/\\end{figure}/' contents.tex|grep -e includegraphics -e caption|xargs -n 2|awk -F[{}] '{print $4,$2}'
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ awk '/\\begin{figure}/,/\\end{figure}/' contents.tex|grep -e includegraphics -e caption|xargs -n 2|awk -F[{}] '{print $4,$2}'
世界座標系とロボットの姿勢 ./figs/coordinate.eps
計測値 ./figs/observation.eps
ランドマークの計測値から2点の相対姿勢を求める ./figs/two_poses.eps
ランドマークの計測値の不確かさを表す共分散行列 ./figs/observation_noise.eps

 

Q2.

第二章の第一文を抽出する、という問題。
今ひとつ問題を理解できてなかったのだが、以下のようにコマンドを実行することで回答が得られる(あまりキレイでは無いけど…)。

grep -v ^% contents.tex | awk '/\\section/,/。/' | xargs | grep -Po 'section.+?。' | sed -n 's/^section{\([^"]*\)} //g;2p'
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ grep -v ^% contents.tex | awk '/\\section/,/。/' | xargs | grep -Po 'section.+?。' | sed -n 's/^section{\([^"]*\)} //g;2p'
平面上を移動し、向きを持ち、カメラでランドマーク観測ができるロボットで graph-based SLAMを実行する方法を考える。

 

パイプごとの各コマンドだが、分解すると以下のようになっている。

# コメントを削除
grep -v ^% contents.tex

# 「\section」から、「。」が出て来る行までを抽出する
grep -v ^% contents.tex | awk '/\\section/,/。/'

# 改行を削除してやる
grep -v ^% contents.tex | awk '/\\section/,/。/' | xargs

# 「\section」から、「。」までを、1行として抽出してやる
grep -v ^% contents.tex | awk '/\\section/,/。/' | xargs | grep -Po 'section.+?。'

# 「\section{*} 」を削除して、2行目(第2セクション)のみを抽出する
grep -v ^% contents.tex | awk '/\\section/,/。/' | xargs | grep -Po 'section.+?。' | sed -n 's/^section{\([^"]*\)} //g;2p'
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ # 「\section」から、「。」が出て来る行までを抽出する
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ grep -v ^% contents.tex | awk '/\\section/,/。/'
\section{はじめに}

この文章は、\cite{grisetti2010}などのチュートリアルを見ても数式の細かいところが分からない
graph-based SLAMについて、
実際の計算方法を細かく解説するためのものである。
\section{問題}

平面上を移動し、向きを持ち、カメラでランドマーク観測ができるロボットで
graph-based SLAMを実行する方法を考える。ランドマークは環境にいくつか存在し、
\section{graph-based SLAMの実装例}

実装の一例を示す。
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ # 改行を削除してやる
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ grep -v ^% contents.tex | awk '/\\section/,/。/' | xargs
section{はじめに} この文章は、cite{grisetti2010}などのチュートリアルを見ても数式の細かいところが分からない graph-based SLAMについて、 実際の計算方法を細かく解説するためのものである。 section{問題} 平面上を移動し、向きを持ち、カメラでランドマーク観測ができるロボットで graph-based SLAMを実行する方法を考える。ランドマークは環境にいくつか存在し、 section{graph-based SLAMの実装例} 実装の一例を示す。
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ # 「\section」から、「。」までを、1行として抽出してやる
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ grep -v ^% contents.tex | awk '/\\section/,/。/' | xargs | grep -Po 'section.+?。'
section{はじめに} この文章は、cite{grisetti2010}などのチュートリアルを見ても数式の細かいところが分からない graph-based SLAMについて、 実際の計算方法を細かく解説するためのものである。
section{問題} 平面上を移動し、向きを持ち、カメラでランドマーク観測ができるロボットで graph-based SLAMを実行する方法を考える。
section{graph-based SLAMの実装例} 実装の一例を示す。
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ # 「\section{*} 」を削除して、2行目(第2セクション)のみを抽出する
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ grep -v ^% contents.tex | awk '/\\section/,/。/' | xargs | grep -Po 'section.+?。' | sed -n 's/^section{\([^"]*\)} //g;2p'
平面上を移動し、向きを持ち、カメラでランドマーク観測ができるロボットで graph-based SLAMを実行する方法を考える。

 

その他、ebanさんの回答が短いので参考。

 

Q3.

脚注の部分を全て抽出するという問題。最初に引っかかる脚注内で{}がネストしているため、結構難しい。
とりあえず、文章内で脚注の終わりは「。}」で統一されているため、これを利用して抽出する(ちゃんとやるならパーサー作らないと駄目っぽい)。

sed -z 's/\n//g' contents.tex | grep -oP '(\\footnote{.+?。})'
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ sed -z 's/\n//g' contents.tex | grep -oP '(\\footnote{.+?。})'
\footnote{この仮定は実用上強すぎるが、実際には、後の計算式から分かるように、2つの姿勢間での値$\psi_{c,t}, \psi_{c,t'}$の差だけが分かれば良い。例えば、2点間で得られた画像の向きを画像処理から割り出すなどの処理で、この差は得られる。}
\footnote{$「10$[\%]」は変数にすべきだが、記号が増えて理解の妨げになるので固定値として説明する。}
\footnote{おそらく$\psi$は$\theta$で置き換えられるので$\psi$を使わない実装もできるが、まだ自分自身では検証していない。}
\footnote{小さい角度なので、$\sin(3\pi/180)$は$3\pi/180$に近似しても良い。}
\footnote{固定しないと世界座標系が決まらない。}

Q4.

各sectionの内容を、そのsection名で別ファイルに保存するという問題。
awkで、対象のsection名を抜き出し、そこにリダイレクトさせるようにすることで対応ができる。時間内に回答することができなかったので、ebanさんの回答を分かりやすくして理解する。

awk -F'[{}]' '/\\section/ {name=$2}{print > name".tex"}' contents.tex
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ ls -la
合計 32
drwxrwxr-x  2 blacknon blacknon  4096  4月 23 08:48 .
drwxrwxr-x 16 blacknon blacknon  4096  4月 22 20:52 ..
-rw-rw-r--  1 blacknon blacknon 21781  4月 22 20:52 contents.tex
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ awk -F'[{}]' '/\\section/ {name=$2}{print > name".txt"}' contents.tex
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ ls -la
合計 60
drwxrwxr-x  2 blacknon blacknon  4096  4月 23 08:48 .
drwxrwxr-x 16 blacknon blacknon  4096  4月 22 20:52 ..
-rw-rw-r--  1 blacknon blacknon 21781  4月 22 20:52 contents.tex
-rw-rw-r--  1 blacknon blacknon 15432  4月 23 08:48 graph-based SLAMの実装例.txt
-rw-rw-r--  1 blacknon blacknon   527  4月 23 08:48 はじめに.txt
-rw-rw-r--  1 blacknon blacknon  5822  4月 23 08:48 問題.txt

 

最初に見たときはだいぶ混乱したが、間にスペース入れたり一部の記号({)を除外したら分かりやすくなった。

 

Q5.

「◯◯座標系」というキーワードを抽出する、という問題。◯◯に入るのはカタカナか漢字という事なので、それ以外を除外してやればいけるようだ。
とりあえず、grepで「[^ぁ-ん]」でひらがな以外、という風に指定できるので、それに記号や句読点をあわせて以下のようにコマンドを実行することで除外が可能だ。

grep -oP [^ぁ-ん、「{]+?座標系 contents.tex | sort -u

 

しかし、ebanさんの回答のように、以下のようにPerlの正規表現を利用することで、カタカナや漢字のみを指定してgrepすることができるらしい。
(知らなかった…)

grep -Po '(\p{Katakana}|\p{Han})+座標系' contents.tex | sort -u
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ grep -oP [^ぁ-ん、「{]+?座標系 contents.tex | sort -u
ロボット座標系
計測座標系
世界座標系
blacknon@BS-PUB-DEVELOP:~/ShellGeiData/vol.28$ grep -Po '(\p{Katakana}|\p{Han})+座標系' contents.tex | sort -u
ロボット座標系
計測座標系
世界座標系

 

Q6.

この辺からもう解けなかった。
文章の段落の頭に全角スペースを入れる、という内容。前にやってたこちらの内容を利用してなんとかできないかと思ったのだが、時間内にはできなかった。

grep -v ^% contents.tex | awk -vRS= -vORS='\n\n' '{printf " ";print $0}' contents.tex

 

(多分)このやり方でできている…はず。
こちらのebanさんの回答でも同様のやり方を取っている(もっと洗練されているけど)。

 

Q7.

各段落の改行を削除する、という内容。
正直わからんかった。多分、ebanさんのこの回答(perl)が一つの答えなのかなー…というぼんやりとした状態。

 

Q8.

目次というか、各詳節項のリストをワンラインで作成するという内容。
とりあえずゴリゴリやっていくしか無いようだ。もうこの時点で疲れ切ってたので、時間内ではできなかった。とりあえず復習で出した答え。
(ginjiroさんのこちらの回答も参考にさせていただいた)

grep -P '^\\.*?section{' contents.tex | sed 's/\\label.*//g;s/section{/section@/;s/}$//g' | awk -F'@' 'BEGIN{a=b=c=0} /^\\sec/{a++;ss=0;print a,$2} /\\subsec/{b++;c=0;print a"."b,$2} /\\subsub/{c++; print a"."b"."c,$2}'

 

今回、とりあえずえらい難しかった…
全然ついてけてなかったので、次回はもうちょい解けるように精進しないとなぁ…(毎回玉砕してこれ言ってる気がするけど)

 

シェルプログラミング実用テクニック シェルプログラミング実用テクニック

grepでひらがな・カタカナ・漢字を抽出する

$
0
0

先日のシェル芸勉強会で、ひらがな以外に対してのgrep処理を調べた際に色々と知見を得られたので、忘れないように残しておく。一応、grep以外でも文字やASCIIコードでの範囲指定は応用できるはず…。

1.文字で範囲を指定する

特定の文字を範囲として指定することで、ひらがな・カタカナ・漢字を指定することができる。
以下、範囲の指定。

ひらがな [ぁ-ん]
カタカナ [ァ-ン]
漢字 [亜-熙]
句読点など [ -】]

 

なお、漢字については日本語で利用する漢字を含む範囲をとりあえず囲っているにすぎないので注意。漢字の部首だったりハングル文字だったり中国語の簡体字・繁体字を除外する場合での記述方法については、こちらを参照すると良いだろう。句読点については、伸ばし棒なども含まれるので個別に指定したほうが良いかもしれない。

この指定方法であれば、特にオプションを付与せずにgrepで抽出させることができる。

grep [ぁ-ん] 対象ファイル

 

2.ASCIIコードで範囲指定する

上記の指定範囲をASCIIコードで記述した場合。以下のようになる(Unicodeでの記述。他の形式の場合は随時コード表を参考に書き換え)。

ひらがな [\x{3041}-\x{3096}]
カタカナ [\x{30A1}-\x{30FA}]
漢字 [々〇?\x{3400}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}]
句読点など [\x{3001}-\x{301B}]

なお、grepでASCIIコードを指定してgrepを行う場合だと-Pオプション(Perlの正規表現での抽出)が必要になる。

grep -P '[\x{3001}-\x{301B}]' 対象ファイル

 

3.PerlのUnicodeプロパティスクリプトを利用する

PerlのUnicodeプロパティスクリプトを利用することで、ひらがな・カタカナ・漢字についてより簡単に指定することができる。
指定可能な一覧はこちらを参考にするといいだろう。

ひらがな \p{Hiragana}
カタカナ \p{Katakana}
漢字 \p{Han}

 

記号などについては、\p{Common}でまとめられてしまうので、個別に指定するのが良いだろう。
ちなみに、「\p{~}」で対象の言語のみを、「\P{~}」で対象の言語以外を抽出可能だ。

grep -P '\p{Hiragana}'

 

基本、最後のUnicodeプロパティスクリプトを使うのが良さそうだ。

 

かんたん Perl (プログラミングの教科書) かんたん Perl (プログラミングの教科書)

LaTeX形式のファイルをプレーンテキストに変換する『OpenDetex』

$
0
0

先日のシェル芸勉強会でLaTeX形式のファイルについての処理がテーマだった。
で、sedとかawkで頑張ってたのだが、なんか他に良いツールが無いものかと思い調べてみたところ、とりあえずプレーンテキスト(と言っていいのかわからないけど)に出力してくれるツール『OpenDetex』というものはあるようだったので、試しにインストールしてみる事にした。検証にはUbuntu Server 16.04 LTSを用いる。

まず、以下のコマンドで前提となるパッケージを導入し、ソースを取得・コンパイルしてインストールする。

sudo apt install make gcc flex
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/opendetex/opendetex-2.8.1.tar.bz2
tar xjvf opendetex-2.8.1.tar.bz2
cd opendetex
make && sudo make install

インストールできたら、後は以下のようにファイルを指定してコマンドを実行してやれば良い。

detex ファイルPATH

 

(一部うまくテキスト化できてないような気もするが)確かにテキストに変換できている。
利用できるオプションはこんな感じ。

blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.28$ detex --help
detex: warning: unknown option ignored - -

detex [ -clnstw ] [ -e environment-list ] [ filename[.tex] ... ]
  -c  echo LaTeX \cite, \ref, and \pageref values
  -e   list of LaTeX environments to ignore
  -l  force latex mode
  -n  do not follow \input and \include
  -s  replace control sequences with space
  -t  force tex mode
  -w  word only output

 

[改訂第7版]LaTeX2ε美文書作成入門 [改訂第7版]LaTeX2ε美文書作成入門

『rootsh』でrootユーザの操作(ターミナルログ)を記録してSyslogに出力する

$
0
0

ターミナルログの記録について、タイムスタンプ付きで取得する場合やSyslogにターミナルログを流す場合、とりあえずscriptコマンドとawkを組み合わせる事で可能になるのだが、この『rootsh』コマンドでも同様にSyslogにターミナルログを出力することができる。残念ながらファイルに出力する際はタイムスタンプを付与できないようだが、syslogには出力することが可能。

今回は、とりあえずCentOS 7にインストールして試してみることにする。
まず、以下のコマンドでインストールを実施する。

yum install -y epel-release
yum install -y rootsh

インストール後は、以下のようにただコマンドを実行するだけでターミナルログがSyslogに出力されるようになる。
scriptコマンドを実行するのとそう変わらないようだ。

rootsh

 

後は、以下のようにターミナルログがsyslogに記録されるようになる。

 

うーん…オプションを見る限り、ログインシェルとしても指定できるので、悪くはなさそうなんだけど…
正直、scriptコマンドとawkで適当なファイルに吐き出させた方が取り回しやすいし、そっちでもsyslog出力が可能。ログインシェルにしても、ラッパースクリプトファイルを作成してやれば同様の事ができるので、現時点ではそこまでの魅力を感じられない気がする。

この1冊ですべてわかる 情報セキュリティの基本 この1冊ですべてわかる 情報セキュリティの基本

grepでメールアドレスを抽出する

$
0
0

grepでメールアドレスを抽出する場合、正規表現を書いて抽出するのが楽になる。
とりあえず、以下のように記述してやることで、メールアドレスと思われるものを抽出することができる。

grep -E "[-_a-zA-Z0-9\.+]+@[-a-zA-Z0-9\.]+"

この時、jpドメインだけを取得死体などがあれば、後ろに付け足す事でそれだけを抽出可能。

grep -E "[-_a-zA-Z0-9\.+]+@[-a-zA-Z0-9\.]+".jp

 

シェルプログラミング実用テクニック シェルプログラミング実用テクニック

teeコマンドで覚えておきたい使い方3個

$
0
0

コマンドの実行結果を、標準出力で確認しつつファイルにも出力させる場合や、複数のファイルに出力させたい事がある。そんなときはteeコマンドを使うと便利だ。
今回は、このteeコマンドの使い方についてをまとめてみることにする。

1.基本的な使い方

基本的には、以下の様にコマンドを実行することで、標準入力から受け付けた内容を指定したファイルと標準出力に出してくれる。

コマンド | tee ファイル
blacknon@BS-PUB-DEVELOP:~$ echo {1..5}
1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~$ echo {1..5} | tee test15
1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~$ cat test15
1 2 3 4 5

 

複数のファイルに出力させる場合、ファイル指定時にスペース区切りで複数指定できる。

コマンド | tee ファイル1 ファイル2 ...
blacknon@BS-PUB-DEVELOP:~/test123$ ls
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {1..5}
1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {1..5} | tee test{1..5}
1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ ls
test1  test2  test3  test4  test5
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ grep '' ./test*
./test1:1 2 3 4 5
./test2:1 2 3 4 5
./test3:1 2 3 4 5
./test4:1 2 3 4 5
./test5:1 2 3 4 5

2.ファイルに追記させる

teeコマンドでは、デフォルトではファイルへの書き込みは上書きモードで行われてしまう。これを上書きではなく追記で行わせるには、「-a」オプションを付与すれば良い。

コマンド | tee -a ファイル1 ファイル2 ...
blacknon@BS-PUB-DEVELOP:~/test123$ grep '' ./test*
./test1:1 2 3 4 5
./test2:1 2 3 4 5
./test3:1 2 3 4 5
./test4:1 2 3 4 5
./test5:1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {01..10} | tee test{1..5}
01 02 03 04 05 06 07 08 09 10
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ grep '' ./test*
./test1:01 02 03 04 05 06 07 08 09 10
./test2:01 02 03 04 05 06 07 08 09 10
./test3:01 02 03 04 05 06 07 08 09 10
./test4:01 02 03 04 05 06 07 08 09 10
./test5:01 02 03 04 05 06 07 08 09 10
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {11..20} | tee -a test{1..5}
11 12 13 14 15 16 17 18 19 20
blacknon@BS-PUB-DEVELOP:~/test123$ grep '' ./test*
./test1:01 02 03 04 05 06 07 08 09 10
./test1:11 12 13 14 15 16 17 18 19 20
./test2:01 02 03 04 05 06 07 08 09 10
./test2:11 12 13 14 15 16 17 18 19 20
./test3:01 02 03 04 05 06 07 08 09 10
./test3:11 12 13 14 15 16 17 18 19 20
./test4:01 02 03 04 05 06 07 08 09 10
./test4:11 12 13 14 15 16 17 18 19 20
./test5:01 02 03 04 05 06 07 08 09 10
./test5:11 12 13 14 15 16 17 18 19 20

 

3.他の複数のコマンドにデータを渡す

こちらでも以前記述したのだが、teeコマンドを利用することで、ファイルではなく他のコマンドに標準入力を渡すことも可能だ。
コマンドの実行結果の出力順は順不同、通常の標準出力も表示されてしまうのだが、パイプで複数のコマンドに標準入力の内容を渡すことができるのは便利だ。

コマンド | tee >(コマンド1) >(コマンド2) ...
コマンド | tee >(コマンド1) >(コマンド2) ... 1>/dev/null
blacknon@BS-PUB-DEVELOP:~/test123$ echo {01..10} | tee >(sed 's/1/a/g') >(sed 's/2/b/g') >(sed 's/3/c/g')
01 02 03 04 05 06 07 08 09 10
0a 02 03 04 05 06 07 08 09 a0
01 0b 03 04 05 06 07 08 09 10
01 02 0c 04 05 06 07 08 09 10

blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {01..10} | tee >(sed 's/1/a/g') >(sed 's/2/b/g') >(sed 's/3/c/g') 1>/dev/null
0a 02 03 04 05 06 07 08 09 a0
01 0b 03 04 05 06 07 08 09 10
01 02 0c 04 05 06 07 08 09 10

 

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus) [改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

コンソール上で置換後の文字列にランダムな数字を使用する

$
0
0

置換後の文字列にランダムな数字・文字列を使用する場合がある。
例えば、「=」以後の値をランダムな数字にしたい場合は、以下の様にsedを実行すると置換できる(とりあえず0~100)。

echo ABC=aaa | sed "s/=.*/=$(echo $((RANDOM % 101)))/g"

blacknon@BS-PUB-DEVELOP:~/test123$ echo ABC=aaa
ABC=aaa
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo ABC=aaa | sed "s/=.*/=$(echo $((RANDOM % 101)))/g"
ABC=82
blacknon@BS-PUB-DEVELOP:~/test123$ echo ABC=aaa | sed "s/=.*/=$(echo $((RANDOM % 101)))/g"
ABC=94
blacknon@BS-PUB-DEVELOP:~/test123$ echo ABC=aaa | sed "s/=.*/=$(echo $((RANDOM % 101)))/g"
ABC=65

 

やってることは単純で、置換後の値として、サブシェルで展開したランダムな数字が入るように指定しているだけだ。置換対象については、単純な指定で済むのであれば上記の様に指定してやると良いだろう。もし、比較的複雑な指定が必要な場合は後方参照などで指定してやればいいだろう。

 

sed & awk: UNIX Power Tools (Nutshell Handbooks) sed & awk: UNIX Power Tools (Nutshell Handbooks)

コンソール上でロードアベレージをグラフで表示してくれる『ttyload』

$
0
0

コンソール上で、ロードアベレージの値をグラフで表示してモニタリングできるツール『ttyload』なるものを見かけたので、試しにインストールしてみた。
UbuntuやDebianであれば、aptコマンドでインストールが可能だ。

sudo apt install ttyload

 

ソースからインストールする場合は、以下のコマンドを実行する。

git clone https://github.com/lindes/ttyload.git
cd ttyload
make && sudo make install

インストール後は、以下のようにコマンドを実行してttyloadを動作させる。
デフォルトでは4秒間隔で表示が変わるので、変更する場合は「-i」オプションで秒数を指定すると良いだろう。

ttyload

 

実践サイバーセキュリティモニタリング 実践サイバーセキュリティモニタリング

ターミナル上にキレイに表示してくれるダッシュボード『Tiny Care Terminal』

$
0
0

調べ物をしていたところ、Nodejsで書かれたツールで、ターミナル上でダッシュボードとして色々と情報を表示してくれるツール『Tiny Care Terminal』なるものを見かけたので、試しに使ってみる事にした。
表示してくれる情報は色々とあるようで、gitのCommitsだったり天気、Twitterなどを指定できるようだ。

とりあえず、インストールは以下のコマンドで行える。

npm install -g tiny-care-terminal
npm install -g git-standup

これでインストールができるはずだ。インストール完了後は、.bash_profile(zshやfishを使っているようであれば、適宜環境にあったファイル)に環境変数を記述してやること。
設定完了後、以下のコマンドを実行すればダッシュボードが表示される。

tiny-care-terminal

 

Linuxステップアップラーニング Linuxステップアップラーニング

指定された文字列をLeet Speakに変換する『leetpass』

$
0
0

よく、「password」を「P@ssw0rd」みたいに記述されていることがある。こういった、アルファベットなどを似た文字に置き換えて表現するのをLeet Speakというらしい。で、そのキーワードでちょっと調べて見たところ、指定した文字列をLeet Speakに変換してくれる『leetpass』なるものを見かけたので、ちょっと試してみた。

Nodejsで書かれているようで、以下のコマンドでインストールができる。

npm install -g leetpass

インストール後、以下のようにコマンドを実行することでランダムにLeet Speakに変換してくれる。

leetpass 文字列
[blacknon@blacknon-ThinkPad-X201]% ~(`・ω・´)  < leetpass password
p@$§word
[blacknon@blacknon-ThinkPad-X201]% ~(`・ω・´)  < leetpass password
p4$$woRd
[blacknon@blacknon-ThinkPad-X201]% ~(`・ω・´)  < leetpass password
p4$5woRD

 

なお、想定されている使い方はパスワードをLeetに変換してくれるというものなのだが、実際にパスワードをこの形式で作成するのはランダムな文字列よりも推測されやすくなるので、あまりおすすめできないかな…。

 

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

ターミナル上で特定のキーワードがファイルのX行目に何個あるのかを集計する

$
0
0

ふと、特定のファイルに対して、指定したキーワードが◯行目に何個含まれているのかをターミナル上で取得できないかなと思ったので試してみた。
例えば、以下のようなファイルで、各行にあるABCの数をそれぞれ求める場合。

blacknon@BS-PUB-DEVELOP:~$ cat test3.txt
ABC123DEF431ABC
112rtr333ABC
ABC3435dfs343ABCABC
ABC23435ABC
ABC334535
g4wsdgr
ABCt3wt3

こういった場合は、grepのnオプション、oオプションを利用することで、比較的簡単に求める事が可能だ。

grep -no キーワード | uniq -c

blacknon@BS-PUB-DEVELOP:~$ cat test3.txt
ABC123DEF431ABC
112rtr333ABC
ABC3435dfs343ABCABC
ABC23435ABC
ABC334535
g4wsdgr
ABCt3wt3
blacknon@BS-PUB-DEVELOP:~$ grep -no ABC test3.txt
1:ABC
1:ABC
2:ABC
3:ABC
3:ABC
3:ABC
4:ABC
4:ABC
5:ABC
7:ABC
blacknon@BS-PUB-DEVELOP:~$ grep -on ABC test3.txt | uniq -c
      2 1:ABC
      1 2:ABC
      3 3:ABC
      2 4:ABC
      1 5:ABC
      1 7:ABC
blacknon@BS-PUB-DEVELOP:~$ grep -no ABC test3.txt | uniq -c | awk '{print $2,$1"個"}'
1:ABC 2個
2:ABC 1個
3:ABC 3個
4:ABC 2個
5:ABC 1個
7:ABC 1個

 

UNIXシェルスクリプト マスターピース132 UNIXシェルスクリプト マスターピース132

直前のコマンドのエラーに対しよしなに(パッケージ入れたり)してくれる『The Fuck』

$
0
0

ぼけーっとネットサーフィンしていたところ、コンソール上でコマンドを実行した際にうまく行かなかった場合、後から実行することでよしなにしてくれる『The Fuck』なるコマンドを見かけたので試してみた。…それにしても大丈夫なんか、この名前。

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

pip3 install --user thefuck

 

Mac OS Xの場合、brewからのインストールも行えるようだ。

brew install thefuck

なお、上記コマンドの場合「~/.local/bin」に実行ファイルが配置されるので、PATHを通しておく必要がある。また、.bashrcなどに追記も必要になるので、以下の内容を追記する。

●~/.bashrc

export PATH=$PATH:~/.local/bin
eval $(thefuck --alias)

 

後は、以下のようにコマンドの実行失敗時にfuckコマンドを実行することで、失敗の原因を解消(パッケージがない場合はインストールするなど)して再実行させることができる。

blacknon@BS-PUB-DEVELOP:~$ sl
プログラム 'sl' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt install sl
blacknon@BS-PUB-DEVELOP:~$ fuck
sudo apt-get install sl && sl [enter/↑/↓/ctrl+c]
[sudo] blacknon のパスワード:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  linux-headers-4.4.0-64 linux-headers-4.4.0-64-generic linux-headers-4.4.0-66
  linux-headers-4.4.0-66-generic linux-headers-4.4.0-70 linux-headers-4.4.0-70-generic
  linux-headers-4.4.0-71 linux-headers-4.4.0-71-generic linux-image-4.4.0-64-generic
  linux-image-4.4.0-66-generic linux-image-4.4.0-70-generic linux-image-4.4.0-71-generic
  linux-image-extra-4.4.0-64-generic linux-image-extra-4.4.0-66-generic
  linux-image-extra-4.4.0-70-generic linux-image-extra-4.4.0-71-generic
これを削除するには 'sudo apt autoremove' を利用してください。
以下のパッケージが新たにインストールされます:
  sl
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 110 個。
24.4 kB のアーカイブを取得する必要があります。
この操作後に追加で 86.0 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 sl amd64 3.03-17build1 [24.4 kB]
24.4 kB を 0秒 で取得しました (174 kB/s)
以前に未選択のパッケージ sl を選択しています。
(データベースを読み込んでいます ... 現在 282812 個のファイルとディレクトリがインストールされて います。)
.../sl_3.03-17build1_amd64.deb を展開する準備をしています ...
sl (3.03-17build1) を展開しています...
man-db (2.7.5-1) のトリガを処理しています ...
sl (3.03-17build1) を設定しています ...

 

なんでも対応してくれるというわけではないが、コレは面白いし便利だ。

 

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

Linuxでユーザ名・所属グループ名(プライマリ・サブ)の一覧を取得する

$
0
0

ふと、Linuxでユーザ名・所属グループ名の一覧を取得したいできないんだっけと思ったので、ちょっと調べてみた。残念ながら、一覧を取得するだけの、単体のコマンドというものは見つけられなかったのだが、ユーザの一覧を取得して、そこからgroupsコマンドに渡すことで、ユーザ名・グループ名の一覧が取得できる。

compgen -u | xargs -I@ groups @

[root@BS-PUB-CENT7-01 ~]# compgen -u | xargs -I@ groups @
root : root
bin : bin
daemon : daemon
adm : adm
lp : lp
sync : root
shutdown : root
halt : root
mail : mail
operator : root
games : users
ftp : ftp
nobody : nobody
avahi-autoipd : avahi-autoipd
systemd-bus-proxy : systemd-bus-proxy
systemd-network : systemd-network
dbus : dbus
polkitd : polkitd
tss : tss
postfix : postfix mail
sshd : sshd
nginx : nginx
test : nobody adm test
test2 : test2 adm

 

このようにコマンドを実行することで、コロン区切りでユーザ名:所属グループ名を取得できる。複数のグループに所属している場合、一番左に位置しているのがプライマリグループとなる。

 

Linuxシェルスクリプトショートガイダンス Linuxシェルスクリプトショートガイダンス

sedでファイルから特定の範囲内を抜き出して改行を削除する(複数行にまたがる抽出範囲を改行を削除して一行にする)

$
0
0

grep -oで、指定した条件のみを表示させるのはよく利用されている。ただ、このやり方だとPCREで指定しても改行を挟んで抽出し、かつ抽出した行の改行を削除して一行にするといった事ができない。
特定の範囲に対して抽出・改行の削除を行うことで同様の事を行えるのだが、その場合は以下のようにsedを利用してやることで行える。

sed -n '/START/,/END/{H;/START/h;/END/!d;x;s/\n/ /gp;}'

[root@BS-PUB-CENT7-01 ~]# cat test1.txt
START
AAA
BBB
CCC
END

sssss

START
!!!
222
###
END

grgr=

START
678
789
890
sss
END
[root@BS-PUB-CENT7-01 ~]# sed -n '/START/,/END/{H;/START/h;/END/!d;x;s/\n/ /gp;}' test1.txt
START AAA BBB CCC END
START !!! 222 ### END
START 678 789 890 sss END

 

シェル&Perl入門―bash/tcsh/grep/sed/awk/Perl (UNIX & Information Science) シェル&Perl入門―bash/tcsh/grep/sed/awk/Perl (UNIX & Information Science)

LDAP(Active Directory)でSSL接続時に利用されている証明書情報を取得する

$
0
0

諸事情があり、ldapsで利用している証明書に関する情報を取得したい、ということがあったので、備忘で残しておく。
以下のようにopensslコマンドを実行することで、ldapsの証明書を読み込む事ができる。

echo | openssl s_client -connect ldapサーバ:636
echo | openssl s_client -connect ldapサーバ:636 2> /dev/null | openssl x509 -text | grep Not # 有効期限のみを確認

 

SSL/TLSを理解する ~共通鍵暗号・公開鍵暗号・ハッシュ関数・電子署名・証明書~ SSL/TLSを理解する ~共通鍵暗号・公開鍵暗号・ハッシュ関数・電子署名・証明書~

ターミナル上でグラフィカルにCPU使用率をモニタリングする『CoreFreq』

$
0
0

CPUやメモリの使用率について、ターミナル上でグラフィカルにモニタリングできるツールというとhtopnMonなどがあるが、CPUをグラフィカルにモニタリングできる『CoreFreq』というものも見かけたので、試しに触ってみることにする。検証はUbuntu 16.04 LTSで行っている。
ちなみに、このツールはどうも仮想マシンでは利用できないようなので、物理マシンで動作させないといけない点に注意。

1.インストール

まず、事前にNMI Watchingを無効化しておく必要があるので、以下のコマンドを実行し再起動する。

sudo sed -i '/^GRUB_CMDLINE_LINUX/s/"$/ nmi_watchdog=0"/' /etc/default/grub
sudo update-grub && sudo reboot

 

再起動完了後、CoreFreqのインストールを実施する。
CoreFreqはソースで提供されているので、ビルドする必要がある。そのため、まず以下のコマンドで必要となるコンパイラ等をインストールする。

sudo apt-get install git dkms build-essential libc6-dev libpthread-stubs0-dev

 

次に、以下のコマンドでソースのダウンロード、ビルド等を行う。

git clone https://github.com/cyring/CoreFreq.git
cd CoreFreq/
make && sudo insmod ./corefreqk.ko
lsmod | grep corefreq

 

ビルド後、出来上がったバイナリを適当にPATHの通ってるディレクトリに配置する。

sudo cp ./corefreqd /usr/bin/
sudo cp ./corefreq-cli /usr/bin/

 

2.モニタリングを行う

バイナリの配置が終わったら、実際にモニタリングをしてみよう。
まず、以下のコマンドでサービスの起動を行う。今回はお試しなのでnohupでの起動。

sudo nohup corefreqd &

 

デーモンとして起動させたら、クライアントプログラムを動かしてみる。

corefreq-cli

 

仮想マシンで動作させられないのがちょっと残念だけど、結構見やすいのでいいかも。

 

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus) ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)

ターミナル上でzipファイルの差分を比較する

$
0
0

Twitterでそんなのあったので、いつか自分にも必要なときが来るかもしれないので備忘で残しておく。
圧縮ファイルの中身が、サイズが少なくてほとんど差異が無いのであれば、以下のように比較してやると楽に差異が確認できる。

diff -y <(unzip -c test1.zip) <(unzip -c test2.zip)

 

でもこれ、目diffをちょっとやりやすくしただけでなかなかツライよなぁ…
もうちょっとなんとかならないかなと思ったので、無理やり以下のように圧縮ファイル内の各ファイルごとにdiffをかけさせてみた。

(X="test1.zip" Y="test2.zip";echo "unzip -l "{$X,$Y}"@" | xargs -d@ -n1 sh -c | awk '$1 != 0 && $2 ~ /^[0-9]/ {print $4}' | sort -u | xargs -I@ bash -c "echo @;diff <(unzip -p $X @) <(unzip -p $Y @)")

[root@BS-PUB-CENT7-01 ~]# unzip -l test1.zip
Archive:  test1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      120  05-13-2017 00:20   test/A.txt
      120  05-13-2017 00:20   test/B.txt
      120  05-13-2017 00:20   test/C.txt
---------                     -------
      360                     3 files
[root@BS-PUB-CENT7-01 ~]# unzip -l test2.zip
Archive:  test2.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      128  05-13-2017 00:27   test/A.txt
      120  05-13-2017 00:20   test/B.txt
      120  05-13-2017 00:22   test/C.txt
---------                     -------
      368                     3 files
[root@BS-PUB-CENT7-01 ~]# (X="test1.zip" Y="test3.zip";echo "unzip -l "{$X,$Y}"@" | xargs -d@ -n1 sh -c | awk '$1 != 0 && $2 ~ /^[0-9]/ {print $4}' | sort -u | xargs -I@ bash -c "echo @;diff <(unzip -p $X @) <(unzip -p $Y @)")
test/A.txt
8c8,9
< AAA08 --- > AAA88
> AAA8888
test/B.txt
test/C.txt
4c4
< CCC04 --- > DCC04
test/D.txt
caution: filename not matched:  test/D.txt
0a1,10
> DDD01
> DDD02
> DDD03
> DDD04
> DDD05
> DDD06
> DDD07
> DDD08
> DDD09
> DDD10

 

…ちょっと(だいぶ)ごちゃっとしてるけど、とりあえず良いか。
もうちょっとキレイに書けそうな気もするけど、どうなんだろう。

 

Linuxステップアップラーニング Linuxステップアップラーニング

SQL記述時にオートコンプリートしてくれるコマンドラインのMySQLクライアント『Mycli』

$
0
0

ちょっとした調べ物をしていたところ、SQLの記述中に対象のデータベースに合わせてオートコンプリートしてくれるMySQLクライアント『Mycli』というツールを見かけたので、試してみる。
Pythonで書かれており、pipからインストールが可能だ。

pip install -U mycli

 

MacOS X やDebian/Ubuntuの場合なら、brewやaptでもインストール可能。

brew update && brew install mycli
sudo apt-get install mycli

インストール後は、以下の様にコマンドを実行することでMySQLのクライアントとして利用できる。

mycli -h ホスト名 -u ユーザ名

 

ログイン後は、普通にSQLを入力してやればよい。下の画像を見るとわかるように、候補や色分けを自動的にしてくれるので、たしかに通常にMySQLクライアントよりもわかりやすい。

 

実践ハイパフォーマンスMySQL 第3版 実践ハイパフォーマンスMySQL 第3版
Viewing all 498 articles
Browse latest View live