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

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


問題121

$ (strace seq 10000000 | head >/dev/null) |& grep -Po '"/.+?"' | tr -d \"
/usr/bin/seq
/etc/ld.so.preload
/etc/ld.so.preload
/proc/self/exe
/usr/bin/seq
/usr/lib/arm-linux-gnueabihf/libarmmem-v6l.so
/etc/ld.so.cache
/lib/arm-linux-gnueabihf/libc.so.6
/usr/lib/locale/locale-archive

なお、抽出されるファイルパスは実行環境により異なります。


問題122

$ (strace -c xargs -n 1 < words >/dev/null) |& awk '/clone$/{print $(NF-1)}'
3000

問題123

$ awk -F '[(<>]' '$(NF-1)~/^[0-9]+\.[0-9]+$/{if(FILENAME~/1/){d1[$1]+=$(NF-1)}else{d2[$1]+=$(NF-1)}}END{for(s in d1){d=d2[s]-d1[s];printf "%s %.6f\n",s,d<0?-d:d}}' dir{1,2}_strace | sort -k2,2nr | head -n3
read 11.879665
openat 0.860119
close 0.487181

問題124

$ ip -o link | awk '{print $2}' | tr -d : | xargs
lo wlan0

なお、表示されるネットワークデバイスは実行環境により異なります。


問題125

# 準備: すでにIPアドレスを持っているネットワークデバイスを確認
$ ip -o -4 addr
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: wlan0    inet 192.168.0.16/24 brd 192.168.0.255 scope global dynamic noprefixroute wlan0\       valid_lft 79901sec preferred_lft 69101sec

# 解答例のワンライナーを実行し、ネットワークデバイス`wlan0`にIPアドレスを追加
$ seq 100 200 | xargs -I@ sudo ip addr add local 192.168.2.@/24 dev wlan0 label wlan0:@

# IPアドレスが追加できているか確認
$ ip -o -4 addr
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: wlan0    inet 192.168.0.16/24 brd 192.168.0.255 scope global dynamic noprefixroute wlan0\       valid_lft 79852sec preferred_lft 69052sec
2: wlan0    inet 192.168.2.100/24 scope global wlan0:100\       valid_lft forever preferred_lft forever
2: wlan0    inet 192.168.2.101/24 scope global secondary wlan0:101\       valid_lft forever preferred_lft forever
2: wlan0    inet 192.168.2.102/24 scope global secondary wlan0:102\       valid_lft forever preferred_lft forever
(...略...)
2: wlan0    inet 192.168.2.198/24 scope global secondary wlan0:198\       valid_lft forever preferred_lft forever
2: wlan0    inet 192.168.2.199/24 scope global secondary wlan0:199\       valid_lft forever preferred_lft forever
2: wlan0    inet 192.168.2.200/24 scope global secondary wlan0:200\       valid_lft forever preferred_lft forever

# 片付け: IPアドレスを削除
$ seq 100 200 | xargs -I@ sudo ip addr del local 192.168.2.@/24 dev wlan0

# IPアドレスが削除できているか確認
$ ip -o -4 addr
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: wlan0    inet 192.168.0.16/24 brd 192.168.0.255 scope global dynamic noprefixroute wlan0\       valid_lft 79716sec preferred_lft 68916sec

なお、IPアドレスの追加/削除の対象となるネットワークデバイスは実行環境により異なります。


問題126

$ echo $BASH_VERSION
5.1.4(1)-release

なお、表示されるバージョン情報は実行環境により異なります。


問題127

$ trap 'clear; (tput lines; tput cols) | xargs' WINCH

解答例でしかけたtrapの解除方法は次の通りです。

$ trap WINCH

問題128

$ strings $(ldd $(which grep) | awk '/pcre/{print $3}') | grep -Pa '^\d+\.\d+'
8.39 2016-06-14

なお、表示されるバージョン情報は実行環境により異なります。


問題129

$ eval echo $(base64 -d crypt | gunzip | strings | sed "s/..../$'\\\\u&'/g")
シェル

問題130

いずれの解答例も、待ち受けポート番号は8080です。

$ busybox httpd -f -p 8080
$ perl -Mojo -E 'a->static->paths(["."]);a->start' daemon -l http://*:8080
$ php -S 0.0.0.0:8080
$ python3 -m http.server 8080
$ Rscript -e 'servr::httd(host="0.0.0.0",port=8080)'
$ ruby -run -ehttpd . -p8080

なお、perlの解答例ではMojoliciousを、Rの解答例ではservrをあらかじめインストールしています。

Written on November 27, 2022