たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

難読化dateコレクション-1-よろしくおねがいします始動

難読化dateしましょう

難読化dateコレクション、略して難daコレは難読化された date コマンド(略して難da)を集めた聖典です

dateコマンド

$ date
20191211日 水曜日 20:31:43 JST

見ての通り日付を出力するツール。coreutils に入っている。
PowerShellにも Get-Date なるものがある。PowerShellだと、 Get を取ってもいいのと、大文字小文字が関係ないことから同じように date で日付が得られる。

# powershell
$ Get-Date
2019年12月11日 20:35:30

$ date
2019年12月11日 20:35:30

よろしくおねがいします始動難da

$ echo よろしくおねがいします|pee "sha1sum" "base64"|grep -o "[a-z]"|sort -u|xargs -n4|awk '{printf $4$1}'|bash
20191211日 水曜日 20:38:37 JST

echo よろしくおねがいします からはじめて最終的に date を作るのでよろしくおねがいします始動と名前をつけた。第45回シェル芸勉強会 大阪サテライトの参加者募集ページの参加コメントから。こっちには rev が含まれているけれど、awk を調整すればいいのでこの記事では取り払った。

動作確認した環境

$ bash --version
GNU bash, バージョン 5.0.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ zsh --version
zsh 5.7.1 (x86_64-debian-linux-gnu)
$ grep --version
grep (GNU grep) 3.3
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
  • xargs
$ xargs --version
xargs (GNU findutils) 4.7.0
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF             32767
sprintf buffer      2040

解説

難daをパイプで分解します。

1: echo よろしくおねがいします
2: pee "sha1sum" "base64"
3: grep -o "[a-z]"
4: sort -u
5: xargs -n4
6: awk '{printf $4$1}'
7: bash

1: echo よろしくおねがいします

「よろしくおねがいします」をSTDOUTに出力するだけ。今回はパイプで後段に流し込んでいる

$ echo よろしくおねがいします
よろしくおねがいします

2: pee "sha1sum" "base64"

moreutils に含まれる pee コマンドでSTDINから受け取った入力を sha1sumbase64 に渡している。今回は前段から「よろしくおねがいします」を受け取っているので、sha1sumbase64 に「よろしくおねがいします」が入力される。出力はそれぞれ

# sha1sum
$ echo よろしくおねがいします|sha1sum
b26493f4b7e606a232654d1848bce9366695e0b5  -

# base64
$ echo よろしくおねがいします|base64
44KI44KN44GX44GP44GK44Gt44GM44GE44GX44G+44GZCg==

pee は引数に並べたコマンドを同時に起動してる。

$ seq 3 |pee 'while read L; do echo X$L; sleep 0.5s; done' "sed 's/^/Y/'"  
X1
Y1
Y2
Y3
X2
X3

なのでこの難daも sha1sum が信じられないほど遅いとかだと入れ替わっちゃうかもと思ったのだけど

> echo よろしくおねがいします|pee "sha1sum" "base64"
b26493f4b7e606a232654d1848bce9366695e0b5  -
44KI44KN44GX44GP44GK44Gt44GM44GE44GX44G+44GZCg==

> echo よろしくおねがいします|pee "sha1sum;sleep 1" "base64"
b26493f4b7e606a232654d1848bce9366695e0b5  -
44KI44KN44GX44GP44GK44Gt44GM44GE44GX44G+44GZCg==

> echo よろしくおねがいします|pee "sha1sum" "base64;sleep 1"
b26493f4b7e606a232654d1848bce9366695e0b5  -
44KI44KN44GX44GP44GK44Gt44GM44GE44GX44G+44GZCg==

> echo よろしくおねがいします|pee "sha1sum" "sleep 1;base64"
b26493f4b7e606a232654d1848bce9366695e0b5  -
44KI44KN44GX44GP44GK44Gt44GM44GE44GX44G+44GZCg==

> echo よろしくおねがいします|pee "sleep 1;sha1sum" "base64"
b26493f4b7e606a232654d1848bce9366695e0b5  -
44KI44KN44GX44GP44GK44Gt44GM44GE44GX44G+44GZCg==

> echo よろしくおねがいします|pee "sleep 1;sha1sum" "sleep 2;base64"
b26493f4b7e606a232654d1848bce9366695e0b5  -
44KI44KN44GX44GP44GK44Gt44GM44GE44GX44G+44GZCg==

> echo よろしくおねがいします|pee "sleep 2;sha1sum" "sleep 1;base64"
b26493f4b7e606a232654d1848bce9366695e0b5  -
44KI44KN44GX44GP44GK44Gt44GM44GE44GX44G+44GZCg==

大丈夫そう。でもこのあとの作業で sort するので実はここの順番にあまり意味はなかったりするのだ…

3: grep -o "[a-z]"

grep で 小文字アルファベットを探す。 -o--only-matching の省略形でマッチした部分だけを出力するオプション。つまり前段の出力から小文字アルファベットだけを取り出している。

$ echo よろしくおねがいします|pee "sha1sum" "base64"|grep -o "[a-z]"
b
f
b
e
a
d
b
c
e
e
b
t
g

4: sort -u

sort は引数に与えたファイルの内容を並び替えるコマンド。ファイルを与えないならSTDINから読み込んだ文字列。
-u--unique の省略形で、最初の同一行のみを出力する。

$ echo よろしくおねがいします|pee "sha1sum" "base64"|grep -o "[a-z]"|sort -u
a
b
c
d
e
f
g
t

5: xargs -n4

xargs はSTDINから引数を作るコマンド。作った引数はコマンドに渡せる。コマンドはデフォルトだと echo になる。
-n max-args--max-args=max-args の省略形で、[max-args] 個の引数に整形してくれる。今回のだと、4行をスペースで連結する。

$ echo よろしくおねがいします|pee "sha1sum" "base64"|grep -o "[a-z]"|sort -u|xargs -n4
a b c d
e f g t

6: awk '{printf $4$1}'

awk はテキスト処理が得意な言語。そう man には書いてた。 引数に文字列を与えると、プログラムだと解釈して実行してくれる。プログラム中に出現する $n はn番目のフィールドという意味。指定なしだとスペースがフィールドの区切り。

前段の出力をよく見てみると、$4 => $1 の順番で出力すると date になることがわかる。きれいだ…

$ echo よろしくおねがいします|pee "sha1sum" "base64"|grep -o "[a-z]"|sort -u|xargs -n4|awk '{printf $4$1}'
date

7: bash

前段までで date という文字列が完成したのでbashとかのSTDINに与えてコマンドを評価してもらうコレは別に $(難da) とか : $(難da); $_ とかでもいい

$ echo よろしくおねがいします|pee "sha1sum" "base64"|grep -o "[a-z]"|sort -u|xargs -n4|awk '{printf $4$1}'|bash
20191211日 水曜日 21:54:34 JST

終わりに

xargs -n4 したあとがとてもきれいだな〜と思ったので記事にしました。また何か思いついたら書くかもしれないし、#難daコレとかに投稿されたやつを勝手に記事にするかもしれないです