splitコマンドは、標準出力やファイルを受け付けて指定された行数などでファイルに分割してくれるコマンドだ。 ファイルが大きすぎる場合や決まった行数ごとに内容が別れているファイルを分割して別のファイルにしたり、分割した内容ごとにコマンドを実行させたりすることができる。

1. 基本的な使い方

基本的には、以下のように標準入力やファイルを指定して分割をする。

command | split
split ファイルPATH
blacknon@BS-PUB-DEVELOP:~/test_split$ cat test.list
a01 a02 a03 a04 a05 a06 a07 a0...

ファイルや標準入力を指定行数で分割して、かつそれをそのまま(一時ファイルを作成せずに)次のコマンドに渡したいといったことがある。 例えば、以下のようなファイルがあったとして、5行ごとに合計を集計するといった処理をしたいとする。

blacknon@BS-PUB-DEVELOP:~$ cat test3.list
a01 13320
a02 64
a03 29730
a04 28184
a05 8993
b01 32490
b02 29077
b03 29590
b04 1291
b05 14097
c01 17676
c02 7998
c03 9720
c04 30072
c05 7565...

ふと、Linuxで使用しているディスクがHDDかSSDか知りたいということがあったので、備忘で残しておく。

1. 「/sys/block/sdX/queue/rotational」から確認する

/sys/block/sdX/queue/rotational」を確認することで、対象のデバイスがディスクかどうか→HDDかSSDかを確認する事ができるようだ。 返り値が1の場合HDD0の場合はSSDを使用している事になる。

[blacknon@blacknon-ThinkPad-X201]% ~(`・ω・´)  < cat /sys/block/sda/queue/...

awkで、特定の列を集計してパーセントを計算した列を追加したいということがあったので、備忘で残しておく。 以下のように、ファイルを2回読み込ませてやり、1回目に集計処理を、2回目に読み込む際にパーセント列の計算をすることで実現できる。

awk 'NR==FNR{a=a+$2;next}{p=$2/a*100;print $0,p"%"}' file file
blacknon@BS-PUB-DEVELOP:~$ cat test2.list
a 4799
b 29975
c 29188
d 31047
e 11659
f 7653
g 19850
h 16754
i 16512
j 1...

集計結果で数字を見る際に桁数がよくわからないことが会ったので、SQLで集計出力時に3桁ごとにカンマ区切りで見やすく表示させる対応をしたので備忘で残しておく。 各DBごとにSQLの記述が異なるのでひとまずよく使用されるMariaDB、PostgreSQL、OracleDB、SQL Serverごとで調べてみることにした。

1. MySQL/MariaDBの場合

MySQL/MariaDBの場合、対象のカラムをformat()で指定することで桁区切りが行える。

select format(1234567,0);
MariaDB [test]> select format(12345...

MariaDBで手元のPC上で動作しているDBから、リモートサーバにssh越しにバックアップする必要があったので、備忘で残しておく。

mysqldump -u ユーザ名 -p パスワード DB名 | gzip | ssh リモートサーバ 'cat > ~/BackupPATH.sql.gz'
mysqldump --single-transaction -u ユーザ名 -p パスワード DB名 | gzip | ssh リモートサーバ 'cat > ~/BackupPATH.sql.gz' # オンラインバックアップ

前にここで書いたlinkcheckerでログインの必要なページでのリンクチェックが必要になったのだが、どうもCookieを使って接続をしてもうまくログインできなかった。 で、linkcheckerrcにログイン情報を記述して読み込ませることで対応できるようなので、以下備忘で残しておく。

まず、以下のような内容で任意のPATHにlinkcheckerrcファイルを作成する。

linkcheckerrc
[authentication] entry=.* ユーザID パスワード loginurl=https://LoginページURL loginuserfield=ユーザ...

Windows 10/Mac OS Xで動く壁紙(動画、GIFなど)を設定できるツール8個

Windows 10において、壁紙に動画を設定できるツールってどんなのがあるんだろうなと思ったので、ちょっと調べてみた。

1. 動画ファイルを壁紙に設定できるツール

1-1. Wallpaper Engine(Windows)

一時期Twitterなどで話題になっていたツール。 Steamで販売されており、ローカルにある動画ファイルやWebページを壁紙に設定することが可能だ。値段は¥398ほど。

このツールについては一時期いろんなトコで取り上げられてたので、詳細についてはそちらで確認するといいだろう。


awkをワンライナーで使っていると、処理の中でシングルクォーテーションを使いたいときが多々ある。 ただ、処理をシングルクォーテーションで囲っている場合、うまくエスケープするには工夫が必要だったりでちょっと面倒くさい。 ので、エスケープ以外にもうまいことシングルクォーテーションを利用する方法が無いかと思って調べてみた。

1. エスケープする

エスケープをしてシングルクォーテーションを利用する場合は、以下の例のようにダブルクォーテーションで「'\''」としてエスケープしたシングルクォーテーションを囲ってやると利用できる。

awk '{print "'\''"}'
blackno...

よくawkで処理中にOSのコマンドを実行させる事があるので、備忘で残しておく。

1. ただコマンドを実行させる

ただOSのコマンドを実行するだけで良いのであれば、system()を使用すればいい。

awk '{system("OSのコマンド")}'
blacknon@BS-PUB-UBUNTU-01:~$ cat test2.txt
a01 15652
a02 13411
a03 2597
a04 8083
a05 11068
a06 17737
a07 32745
a08 22546
a09 32608
a10 32074
a11 17574
a12 8745
a13 2...

sedで遊んでたとき、GNU sedにスペース区切りの文字列の各文字間や、文字列の前後を指定するパターンがあるということを知ったので、備忘で残しておく。 GNU sedでは文字列の各文字列間は「\B」、文字列の前後は「\b」で指定できるので、これを利用すれば良い。

echo abcdefg hijklmn | sed 's/\B/X/g' # 文字列の各文字間
echo abcdefg hijklmn | sed 's/\b/X/g' # 文字列の前後
lacknon@BS-PUB-UBUNTU-01:~$ echo abcdefg hijklmn | sed 's/\B/X/...

sedで置換条件に最短一致を指定したい事があったので、備忘で残しておく。 残念ながらsedでは最長一致が基本で、最短一致の指定方法は用意されていない。 このため、以下のように「^」と組み合わせて開始文字列を指定して正規表現を記述してやることで、最短一致を指定する。

echo "abc123def456ghi" | sed 's|<[^<]*>||g' # 例1) <> で囲んでる範囲だけ対象にする
echo "abc123def456ghi" | sed 's|||g' # 例2) で囲んでる...

Webサイトを巡回してリンク切れを確認するPython製のCLIツール『linkchecker』を使ってみる

リンク切れページの調査について、前回wgetコマンドを使用した方法について記述したが、これだとリンク元のページがどこかがわからないため、あまり扱いやすいとはいえない。 で、リンク切れチェック用のツールを探してみたところ、『linkchecker』なるツールが良さそうだったのでこれを使ってみることにした(ただ、最近はあまりアップデートがされていないらしく、作者にも連絡が取れてない状態でどうなるかわからない様子。とりあえず新しくプロジェクトが作成されているようなので、今後はそちらに移っていくのかなと)。

今回は、この『linkchecker』をインストールして実際にサイトのリンク切れ情...


諸事情により、Webサイトのリンク切れ調査をする必要が発生し、なんかお手軽にできないかなと調べてみたところwgetで調べることができそうだったので、実際にやってみることにした。 以下のようにオプションを付与することで、リンク切れのページをログにリストアップさせることができるようになる。

wget --spider -o ./wget.log -e robots=off -r -p http://target.domain

設定しているオプションは以下。

  • --spider … ファイルのダウンロードは行わない
  • -o ./wget.log … カレントディレクトリ配下にログを出力す...

ターミナル上で集計処理などをしてて、数字の桁数が多いと読めなくなってくる事がある。 numfmtコマンドが使えるかと思ったのだが、システムで使用する数字を変換(1024MB→1GBとか)する場合は良いとして、ただの数字の桁区切りはできないようだ。 という訳で、他で数字を桁区切りさせる手法について調べてみた。

1. printfで桁区切りをさせる

bashの組み込みコマンドであるprintfを使う場合、以下のように「%'d」でフォーマットを指定してやるとよい。

printf "%'d\n" num
echo num | printf "%'d\n" $(cat) # パイプか...

Rundeckで、一部のコマンドが処理自体はちゃんとしててもWarningのためにexit codeを0以外で返していたため、暫定対応で無理やり正常終了になるようにした(あとでちゃんと直しておいた)。 で、一応念のため備忘として残しておくと、以下のようにコマンドを実行させることで、(各パイプラインは別として)1行のコマンドとしては強制的に正常終了で終わる。


nohupでパイプを用いた処理をキックする場合、普通にやるとうまく認識されず、パイプの最後にあるコマンドだけがバックグラウンドジョブとしてキックされてしまう。 これを全てバックグラウンドジョブとして動作させる場合は、以下のようにnohupで実行してやればいい。

nohup bash -c 'コマンド | コマンド' &

前回、torをUbuntu/CentOSへインストールし利用できるようにしたので、今回はPythonからtor経由でのアクセスを行うようにする。 色々なやり方はあるようなので、2つほど試してみる。

1. requesocksを使う場合

requestsのforkでsocksを使うことができるパッケージがあるので、これで対応するのが楽そうだ。 事前にpipでインストールをしておく。

sudo pip install -U requests[socks]

後は、以下のように使用してtor経由でアクセスをすると良い。

#!/usr/bin/python
# -*- coding:...

ふと、tor経由でwgetやcurlでWebサーバにアクセスしてみようと思ったので、ちょっとやってみた。 まぁ特に難しい事も何もなかったのだけど、とりあえず備忘で残しておく。

1. torのインストール

まずtorのインストール。Ubuntu Server 16.04 LTS/CentOS 7であれば、普通にaptやyum(epel必要だけど)からインストールが可能だ。

Ubuntuの場合

sudo apt install tor

CentOSの場合

sudo yum install epel-release
sudo yum install tor

インストールが...


ちょっとした作業で、「\n」とか「\t」で改行やタブが記述されている内容を、通常どおり改行やタブとして出力させたいということがあり、そのためにechoやprintfに標準入力を渡す必要があった。 で、以下のようにcatと組み合わせることで、echoやprintfにパイプから出力を渡すことができる。

echo "aaa\\tbbb\\nccc\\tddd" | echo -e $(cat)
echo "aaa\\nbbb" | printf $(cat)

先日のシェル芸勉強会のテーマがjoinコマンドだったのだが、普段あまりjoinコマンドを使ってなかった事もあって、あまりjoinコマンドで解答をできなかったので、使い方について調べなおしてまとめてみることにした。

1. 基本的な使い方

joinコマンドは、2つのファイルをSQLのjoinのように結合して表示してくれるというコマンドになる。 以下のように、1列目の形式が同じで順番も揃っている場合、オプションなしで結合をしてくれる。

join file1 file2
blacknon@BS-PUB-DEVELOP:~$ cat test1.a
1 a
2 a
3 a
4 a
5 a...

ファイルに合わせたアイコンを付けて表示してくれる『colorls』

ぼけーっとTwitter眺めてたところ、lsにファイルの種類に応じたアイコンを付けて表示してくれる『colorls』なるプロジェクトを見かけたので、実際に入れて触ってみることにした。 今回はUbuntu 16.04 LTSで確認をしている。

Rubyで書かれているので、事前にRubyをインストールしておく必要がある。 また、アイコンを表示させるため、ターミナルに設定するフォントが必要になるようだ。 ここでは、nerd-fontsをインストールする。

git clone https://github.com/ryanoasis/nerd-fonts
cd nerd-fonts
....

以前sedで行った内容について、Pythonで書き換える必要があったので一応備忘で残しとく。 特に難しい処理をするわけでもなく、文字列を読み込んで1文字づつ大文字・小文字・数字に合わせて処理をしてやればいいだけだ。 今回は、各文字列についてgrepの正規表現に書き換えてやるようにする。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys

upper = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W'...

Pythonで、配列の比較を行って片方にしか無い要素を取得したいという場合、setにすることでそういった比較が行えるようだったので備忘で残しておく。 以下のように配列を作成して、setにして比較をしてやればいい。 なお、set生成時に重複した値は削除される。

a = [1,2,3,5,8,11,1,2]
b = [1,3,5,7,9]

set_a = set(a)
set_b = set(b)

# 重複した値は削除されている
print(set_a)

# 配列「a」にしかない要素を取得
print(set_a - set_b)

# 配列「b」にしかない要素を取得
print(set...

コマンドの並列処理を行う際、個人的にはGNU Parallelコマンドを使用するか、xargsで-Pオプションを付与するかのどちらかを使うことが多いのだが、GNU Parallelのオプションや使い方についてちゃんと調べた事がなかったので、調べてまとめてみることにする。 なお、検証に利用するGNU parallelのバージョンは以下。

blacknon@BS-PUB-DEVELOP:~$ parallel --version
GNU parallel 20141022
Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014 Ole Tan...

ちょっとした処理で、特定の大文字・小文字・数字・記号ごとに、それぞれを違う文字列(大文字=?u、小文字=?l、数字=?d、記号=?s)に置換したいことがあったので、備忘で残しておく。 以下のように、xargsで1文字づつ渡してやり、最初の記号だけ他の置換で被らない文字列(??)に置換してやり、最後にそれを?sに置換することで対応している。

echo 'StrIng$123!' | xargs -d. -n1 -I@ bash -c "printf '@' | sed -e 's/[[:punct:]]/??/g;s/[[:lower:]]/?l/g;s/[[:upper:]]/?u/g;s/[[:digit:]]/?d/g;s/??/?s/g;'"

ちょっと前にsedとブレース展開を使ってLeet変換した文字列の一覧を羅列するという処理についてやってたのだが、ふと特定の文字列がLeet変換されている文字列をgrepする場合どうすれば良いのかなと思い調べてみたので、備忘として残しておく。

grepには-fオプション(指定されたファイルの中にある文字列からgrepする)があるので、特に難しいこともなくプロセス置換で実現できる。Leetの組合せは状況に応じて足していけばいい。

grep -i -f <(eval echo $(echo 文字列 | sed -e 's/a/{a,@}/g' -e 's/s/{s,\\\$}/g' -e 's/o/{o,0}/g') | tr ' ' '\n') /tmp/test.txt

ふと、nohupでバックグラウンドジョブ実行させたジョブについて、終了時にメールやSlackで通知させることができないかと思ったので、ちょっとやってみた。 で、以下のようにすることで、nohupで実行するコマンドを変数に入れて実行・通知させることができるようだ。

(cmd="echo foo{bar,baz}";nohup $cmd && (echo $cmd | mail mail@domain.sample -s "Job finish") > ./cmd &)


先日、sedとブレース展開を用いて文字列の大文字・小文字・Leet変換全ての組み合わせを取得するという処理についてやったが、今回は同じようなことをPythonでやるにはどうすればいいか調べてみた。 Pythonでは、itertoolsというモジュールを使うことで、この組み合わせを簡単に生成できるようだ。

以下のように、組み合わせとなる文字列をリストに入れておき、それを利用することでリストが取得できる。

leetlist.py
#!/usr/bin/python # -*- coding: utf-8 -*- import sys from itertools impor...