難読化dateしましょう
難読化dateコレクション、略して難daコレは難読化された date
コマンド(略して難da)を集めた聖典です
dateコマンド
$ date 2019年 12月 11日 水曜日 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 2019年 12月 11日 水曜日 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から受け取った入力を sha1sum
と base64
に渡している。今回は前段から「よろしくおねがいします」を受け取っているので、sha1sum
と base64
に「よろしくおねがいします」が入力される。出力はそれぞれ
# 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 2019年 12月 11日 水曜日 21:54:34 JST
終わりに
xargs -n4
したあとがとてもきれいだな〜と思ったので記事にしました。また何か思いついたら書くかもしれないし、#難daコレとかに投稿されたやつを勝手に記事にするかもしれないです