ちょっとした処理で、拡張子より前で同名の名称が使われていて、かつ指定した拡張子が全て揃っているファイルのみを抽出する必要があったので、備忘で残しておく。 awkだけで処理させればもうちょっと短く書けそうな気もするが、ひとまず以下のように記述すれば対応可能だ。

ls -1 *.{txt,jpg,csv} | awk -F. '{a[$1]++}END{for(k in a)if(a[k]>2){print k}}' | xargs -I@ sh -c 'ls -la @*'

コンソール上でリストから選択してsystemdの管理が行える『Chkservice』

調べ物をしていたところ、コンソール上でsystemdの内容をリスト表示し、そこから選択して管理が行えるTUIのツール『Chkservice』なるツールを見かけたので、試しに入れてみることにした。

1. インストール

Ubuntuの場合はリポジトリが用意されているようなので、そちらからインストールができる。

Ubuntuの場合

sudo add-apt-repository ppa:linuxenko/chkservice
sudo apt-get update
sudo apt-get install chkservice

CentOSの場合

CentOSなどにイン...


コンソール上で文字列を融合( パトカータクシー であれば、パタトカクシーー)する処理について、ワンライナーで記述してみたので備忘として残しておく。

echo パトカー タクシー|sed -z 's/ /\n/g;s/\B/ /g'|rs -T|tr -d ' \n'
eval 'paste -d ""' \<\(echo\ {パトカー,タクシー}'|grep -o .)'|tr -d '\n'

一部の処理をjqコマンドでやった場合は以下。 こういった処理の場合だと、jqにはあまり向いてないようだ。 (2個目のやつは@ebanさんのやり方を参考にした。)

...

ふと思いつきでそんな処理を書いてたので、念のため備忘で残しておく。 以下のように、一度readで変数に突っ込んでやって、その後は文字数を元にxargsで1個づつ処理してやればいい。

echo qwerty|(read x;seq 2 $(($(echo $x|wc -c)-1))|xargs -I@ bash -c "echo $x|sed 's/./.&/@'")
$ echo qwerty|(read x;seq 2 $(($(echo $x|wc -c)-1))|xargs -I@ bash -c "echo $x|sed 's/./.&/@'")
q.werty
qw.erty...

コンソール上で、ネットワークアドレスとCIDRを指定して対象範囲のIPアドレス一覧を出力したい場合、どんな方法があるかなと思いちょっと調べてみた。 大体3個くらい(PythonとかRubyでスクリプト書くって方法を入れればもっとあるけど)を思いついたので、とりあえず残しておく。

1. nmapを使う

疎通できるネットワークにいると疎通確認が行われてしまうのでちょっと問題があるが、nmapの疎通可能IPアドレスを調査する -sL オプションを利用してやることで、対象範囲のIPアドレスの一覧を取得できる。

nmap -sL 172.16.0.0/24|grep "Nmap scan...

ふと、ネットワークアドレスとCIDRを指定して対象範囲で利用できるIPアドレスの一覧を取得する楽な方法ないかなー、と思って調べて見たところ、『prips』コマンドというものがあるようなので備忘として残しておく。 UbuntuやMacであれば、以下のコマンドでインストールできる。

sudo apt install prips  # Ubuntuの場合
sudo brew install prips # Mac OS Xの場合

インストールできたら、以下のようにコマンドを実行することで指定レンジのIPアドレスの一覧を取得できる(ネットワークアドレスとブロードキャストアドレスも含むけど)...


sedでは四則演算とかの計算処理については対応していないのだが、bashと組み合わせる事で計算処理ができないかとやってみたので備忘で残しておく。 で、結論としては以下のように、e(置換や抽出した内容を元に組み立てたコマンドを実行する) を利用することで、bashで $((計算式)) をechoさせることで計算をさせることができる。

echo 1234 | sed 's/[0-9]*/echo $((& + 1111))/ge'
blacknon@BS-PUB-UBUNTU-01:~$ echo 1234 | sed 's/[0-9]*/echo $((& + 1111))/ge...

ぼけーっとネットサーフィンしてたところ、Linuxで(英語だけど)コンソール上で文章を打つと、Siriみたいに対応してくれる『Betty』なるツールを見かけたので、試しに入れてみることにした。 Rubyで書かれているようだ。

とりあえず、今回はUbuntu Server 16.04 LTS上にこれを入れてみることにする。 以下のコマンドでインストールができる。

git clone https://github.com/pickhardt/betty
cd betty
ruby install.rb
source ~/.bashrc

インストールできたら、実際に使ってみよう。 例...


VyOS 1.1.7でOpenVPNの認証にActive Directory(LDAP)を使用する場合、VyOSとしての機能だけでは実現できず、Debianのパッケージ等を入れてやる必要がある。 現時点ですでにVyOS側にOpenVPNでの諸設定(証明書認証等)はすでに済んでいる状態で、AD連携だけ追加するという前提で進めていく。 まず、以下のコマンドでDebianのリポジトリを登録、OpenVPNでLDAP連携を行うためのプラグインを導入する。

set system package repository squeeze components 'main contrib non-free'...

Yubikeyでは、Mac OS Xログイン時にパスワードとセットでYubikeyを使用しないとログインできないようにする(二要素認証設定ができる)ことができるので、実際やってみることにした。 手順も用意されていて結構簡単に実現できるようになっている。 参考にする手順はこれ(2016年12月)。 事前に、Yubikeyでチャレンジレスポンスの設定(手順上はSlot2なので、検証時はSlot2で行った)をしておくこと。

まず、こちらのページから「Mac OS X Logon (using Yubico-PAM)」をクリックし、pamモジュールのインストーラーをダウンロード、2要素...


コンソール上に単位行列を出力できないかと思ったので、シェル芸でやってみることにした。 特に難しいこともなく、以下のようにseqとprintfでうまいこと出力してやればいい。

echo 20|(read i;seq $i|xargs -I@ bash -c "printf %0*d\\\n $i|sed s/0/1/@")

ここのところ、個人的にseqコマンドを多様することが多くなったので、あとで見返すために色々と使い方を残しておきたいなというのがあるので備忘として残しておく。

1. 基本的な使い方

基本的には、以下のようにして連続した数字を出力させることができる。 マイナスや少数の数字も指定できる。

seq x # 1~xまでの数字を各行に出力する
seq y x # y~xまでの数字を各行に出力する
seq y n x # y~xまでの数字をnごとに各行に出力する
blacknon@BS-PUB-DEVELOP:~$ seq 5
1
2
3
4
5
blacknon@BS-PUB-DEVELO...

VLANで小分けにしているネットワークでVyOSを用いたVPNルータを追加しようとした際、各サブネットごとにゲートウェイ等を設定してやりたいということがあったので、ポリシーベースルーティングを設定したのでその備忘。 なお、VyOSのバージョンは1.1.7を利用している。

以下、コンフィグの設定例。

...
 interfaces {
     bonding bond0 {
         ...
         vif 100 {
             bridge-group {
                 bridge br100
             }...

以前にapu1c2という、NICが3つ搭載されたx86_64の基盤にVyOSをインストールしていたが、その後継機であるapu2c4を手に入れたので、これにVyOSをインストールする。 で、この時に結構ハマったので記録として残しておく。

なお、インストールにあたりシリアルコンソールが必要になるのだが、レートがapu2c4は115200、VyOSは9600になっているため、VyOSのブートに切り替わった際にレートを切り替える必要があるため、事前にこちらを参考にインストールディスクをカスタムしている。

当初、インストール方法としてUSBのCDドライブやUSBメモリからインストールをさ...


タブとスペースを変換するのにsedを使う事があるのだが、ソースコードのインデントなんかだと幅がズレてしまったりしてあまり良くな買ったりする。 で、そういうときはexpandコマンドを使うと楽なので、一応使い方について残しておくことにする。

1. タブ→スペース変換

タブ→スペースに変換する場合は、expandコマンドを利用する。

blacknon@BS-PUB-UBUNTU-01:~$ # タブ付きで出力
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "\taaa\nxxx\tbbb"
        aaa
xxx     bbb
blacknon...

コンソール上で文字列を反転する場合というと、基本的にはrevコマンドを利用する。 で、もしそれを使わない場合どんな感じにできるかなと思ったので、ちょっとやってみた。 awkなら結構楽にできるのだが、個人的なマイブームからまずbashの変数展開を利用してみる。

で、残念ながら1行の出力にしか対応してないけど、以下のようにコマンドを実行することで出力を反転させることができる。 (forでreadlineにすれば複数行もいけると思うけど、ワンライナーでそれやるのはちょっとアレかなと思ったのでそれ以上は追求していない)

コマンド|(set -a;read i;l=${#i};echo eval...

ここでそんな感じの処理について見かけたので、シェル芸で文章中からの単語の集計(例:「ABCDandABCDorABCDsoABCD」だと、ABCDが4回使われているなど)をシェル芸で一発でできないかなと思ったので、試しにやってみることにした。 まず、文章の中から単語を取得する必要があるのだが、形態素解析だと対象が文章ではなくバラバラな羅列だった場合に使えないので、文章中から1文字づつ範囲をずらして文字を抽出し、それを集計することで使われている文字列を取得することにした。

で、ちょっと長いけど以下のようにすることで、複数回出現した文字列の組み合わせが取得できる。

echo ABCDan...

ふと、先日のシェル芸勉強会のQ7みたいな「連続したn文字の組み合わせ」を羅列させたいなと思ったので、ちょっと調べてみた。 とりあえず、以下のように記述することでn文字の組合せを出力できる。 ちなみにsedのブレース展開で件数を処理しているため、開始が2からになっている。

sed -e'p;1s/^.//g;'#{2..n}|(X=$(cat);echo "$X"|grep -Eo .{$(wc -l<<<"$X")})|sort

リピートされた文字を削除する処理が必要になったので、備忘で残しておく。 以下のように記述することで、sedで同じ文字がリピートされた場合は削除ができる。 なお、GNU Sedでしか動作しないので注意。

echo aabbbbbbbbbcde | sed 's/\(.\)\1\+/\1/g'
echo aabbbbbbbbbcde | sed -r 's/(.)\1+/\1/g' # エスケープなしにして分かりやすくした場合
echo aabbbbbbbbbcde | sed -r 's/(.)\1{1}/\1/g' # リピート回数を指定する場合({}のなかに入る数字はリピート回数-1)

なんとなく興味本位で他の人とターミナルの共有方法について調べていたところ、『tmate』なるツールを見かけたので触ってみることにした。 複数のOS向けにインストールコマンドが用意されているが、今回はUbuntu Server 16.04 LTSにインストールをしてみる。

sudo apt-get install software-properties-common && \
sudo add-apt-repository ppa:tmate.io/archive    && \
sudo apt-get update                             && \
s...