シェル芸160本ノック解答例 その14

技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。


問題131

# ASCII以外の文字を含むメール件名は、文字化けしないように`nkf -M`でMIMEエンコードする
$ wget example.com/big_file.tar.gz && (echo ダウンロード成功 | mail -s "$(echo wget成功 | nkf -M)" mailto@example.net) || (echo ダウンロード失敗 | mail -s "$(echo wget失敗 | nkf -M)" mailto@example.net)

なお、URLとメールアドレスはダミーです。


問題132

自身で管理しているWebサーバがありませんので、本来ならばtail -F /var/log/apache/access.logである部分を、次の解答例ではperl -lnE '$|=1;sleep 1;say' httpd-access.logで代用しています。

$ perl -lnE '$|=1;sleep 1;say' httpd-access.log | grep --line-buffered -P ' 500 \d+$' | xargs -I@ echo '@' | mail -s 'Error 500' mailto@example.net &

なお、メールアドレスはダミーです。


問題133

$ echo '@reboot /usr/bin/sleep 180 && /usr/sbin/poweroff' | sudo crontab

なお、sleepコマンドおよびpoweroffコマンドの場所は実行環境により異なります。


問題134

$ grep -Pn '^ {1,3}?( {4})*\S' hoge.py | cut -d: -f1
5

問題135

$ perl -lnE 'say((split / /)[1]) if /defun/ && (()=/\(/g) != (()=/\)/g)' sample.lisp
fib
sum1

問題136

$ sed -Ez 's/(int b\(.+)(void a\(.+)(int main\(.+)/\2\1\3/' somecode.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void a()
{
        int i = 0, j = b();
        for (; i < j; i++){
                puts("a");
        }
}

int b()
{
        return rand()%10;
}

int main(int argc, char const *argv[])
{
        srand(time(NULL));
        a();
        return 0;
}

問題137

$ indent -st -i4 -bli0 -npcs -npsl fib.c
#include <stdio.h>

int fib(int n)
{
    if (n <= 1)
    {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}

int main(void)
{
    int i;
    for (i = 0; i < 10; i++)
    {
        printf("%d\n", fib(i));
    }
    return 0;
}

問題138

$ eval echo $(sed 's/.*/{&}/' os.csv browser.csv service.csv | xargs | sed 's/ /" "/g') | xargs -n3 | grep -Pv '([Sx] IE|[sx] Sa)'
Windows IE ServiceA
Windows IE ServiceB
Windows IE ServiceC
Windows Chrome ServiceA
Windows Chrome ServiceB
Windows Chrome ServiceC
Windows FireFox ServiceA
Windows FireFox ServiceB
Windows FireFox ServiceC
macOS Chrome ServiceA
macOS Chrome ServiceB
macOS Chrome ServiceC
macOS FireFox ServiceA
macOS FireFox ServiceB
macOS FireFox ServiceC
macOS Safari ServiceA
macOS Safari ServiceB
macOS Safari ServiceC
Linux Chrome ServiceA
Linux Chrome ServiceB
Linux Chrome ServiceC
Linux FireFox ServiceA
Linux FireFox ServiceB
Linux FireFox ServiceC

問題139

$ echo https://{,{,{,cc.}bb.}aa.}example.com/A{,/B{,/C}} | xargs -n1
https://example.com/A
https://example.com/A/B
https://example.com/A/B/C
https://aa.example.com/A
https://aa.example.com/A/B
https://aa.example.com/A/B/C
https://bb.aa.example.com/A
https://bb.aa.example.com/A/B
https://bb.aa.example.com/A/B/C
https://cc.bb.aa.example.com/A
https://cc.bb.aa.example.com/A/B
https://cc.bb.aa.example.com/A/B/C

問題140

$ paste -d '' <(faker -r=100 -s='' ipv4_public) <(yes ' - - [' | head -n100) <(faker -r=100 -s='' date_time | tr - / | sort) <(yes ' +0900] "GET ' | head -n100) <(tar tzf dir.tar.gz | sed 's/.//;/\/$/d' | shuf -rn100) <(yes ' HTTP/1.1" 200 ' | head -n100) <(shuf -i10-999 -n100)
38.23.208.137 - - [1970/06/18 04:29:10 +0900] "GET /css/main.css HTTP/1.1" 200 199
132.40.28.50 - - [1970/09/03 03:01:20 +0900] "GET /search.php HTTP/1.1" 200 392
119.41.205.203 - - [1972/05/13 22:43:37 +0900] "GET /js/main.js HTTP/1.1" 200 118
(...略...)
172.35.193.125 - - [2018/05/17 22:22:39 +0900] "GET /product.php HTTP/1.1" 200 46
132.75.90.195 - - [2021/12/04 05:26:34 +0900] "GET /js/bootstrap.js HTTP/1.1" 200 128
107.93.126.184 - - [2022/05/18 18:50:28 +0900] "GET /js/npm.js HTTP/1.1" 200 180

なお、ダミーログは、解答例のワンライナーを実行するたびに異なるものが生成されます。

Written on December 1, 2022