シェル芸160本ノック解答例 その11
技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。
- 解答例の範囲: 問題101〜問題110
- 前回の解答例: シェル芸160本ノック解答例 その10
問題101
$ join -a1 -e@ -oauto <(echo {a..z} | grep -o [a-z]) <(grep -o [a-z] alphabet_connection | sort | sed 's/./& &/') | awk '{a=a $2}END{print a}' | sed -E 's/([^@])[^@]*([^@])/\1-\2/g;s/@+/ /g'
a-c e-f i-l p-r u w y-z
問題102
$ echo $BASH_COMMAND
echo $BASH_COMMAND
# 別解1(コマンド履歴に正常にアクセスできることが必要)
$ history | tail -n1 | cut -c8-
history | tail -n1 | cut -c8-
# 別解2(`eval`を利用した正統派?クワイン)
$ q='echo "q=$a$q$a;a=\\$a;eval \$q"';a=\';eval $q
q='echo "q=$a$q$a;a=\\$a;eval \$q"';a=\';eval $q
問題103
# 準備: `hoge`を作成し、ファイル情報を表示
$ echo a > hoge
$ ls -l hoge
-rw-r--r-- 1 mitsuhisa mitsuhisa 2 11月 15 01:03 hoge
# 解答例のワンライナーを実行し、再度ファイル情報を表示
$ seq 99 | xargs -I@ ln hoge /tmp/hoge@
$ ls -l hoge
-rw-r--r-- 100 mitsuhisa mitsuhisa 2 11月 15 01:03 hoge
# 片付け: 作成したハードリンクを削除
$ rm -f /tmp/hoge*
問題104
$ perl -E 'for(1..999){say "_"x$_}' | while read n; do truncate -cs0 $n 2>/dev/null || { echo $((${#n}-1)); exit; } done
255
問題105
$ du -hs /usr/* | sort -k1,1hr -k2,2
16G /usr/share
8.3G /usr/lib
5.7G /usr/local
1.2G /usr/bin
462M /usr/src
386M /usr/games
96M /usr/include
93M /usr/sbin
12M /usr/libexec
なお、集計結果は実行環境により異なります。
問題106
$ ls -l /bin/ | awk 'NR>1&&$1~/[^rwxl-]/'
-rwsr-xr-x 1 root root 30112 2月 27 2021 fusermount
-rwsr-xr-x 1 root root 50720 1月 21 2022 mount
-rwsr-xr-x 1 root root 173840 11月 3 06:46 ntfs-3g
-rwsr-xr-x 1 root root 79396 1月 21 2022 su
-rwsr-xr-x 1 root root 30236 1月 21 2022 umount
なお、検索結果は実行環境により異なります。
問題107
$ zgrep -ah '(sudo:session): session opened for user root' /var/log/auth.log* | cut -c-3 | LANG=C sort -M | uniq -c
33 Oct
27 Nov
なお、集計結果は実行環境により異なります。
問題108
問題108小問1
$ zgrep -Pa 'Killed process \d+ \(.+?\)' syslog.gz | sed 's/.\+(//;s/).*//' | sort | uniq -c
9 superapp
問題108小問2
$ zgrep -Pa 'invoked oom-killer' syslog.gz | sed 's/.\+] //;s/ invoked.*//' | sort | uniq -c
3 apache2
1 apport
2 gmain
1 lsb_release
1 systemd-network
1 tmux: server
問題109
$ sudo find /etc -type f -exec md5sum {} + | sort | uniq -w32 --all-repeated=separate
16926da8a6c53bc28fbc3b16d899fceb /etc/shadow
16926da8a6c53bc28fbc3b16d899fceb /etc/shadow-
272913026300e7ae9b5e2d51f138e674 /etc/magic
272913026300e7ae9b5e2d51f138e674 /etc/magic.mime
46da7b710e34cbaaf4a40077975bd7cc /etc/logcheck/ignore.d.server/rng-tools-debian
46da7b710e34cbaaf4a40077975bd7cc /etc/logcheck/violations.ignore.d/rng-tools-debian
610ee9057faa0b50b08cb23228e2ebf2 /etc/subgid
(...略...)
# `fdupes`を使った別解
$ sudo fdupes -qr /etc
/etc/passwd-
/etc/passwd
/etc/logcheck/ignore.d.server/rng-tools-debian
/etc/logcheck/violations.ignore.d/rng-tools-debian
/etc/sv/ssh/.meta/installed
/etc/environment
/etc/security/opasswd
/etc/.pwd.lock
(...略...)
なお、検索結果は実行環境により異なります。
問題110
$ sudo find /var/log -type d | while read d; do printf "$d : "; sudo find "$d" -type f -maxdepth 1 | wc -l; done | sort
/var/log : 118
/var/log/ConsoleKit : 7
/var/log/apparmor : 0
/var/log/apt : 27
/var/log/chkrootkit : 0
/var/log/clamav : 13
/var/log/cups : 24
/var/log/exim4 : 12
/var/log/firebird : 0
/var/log/fsck : 2
(...略...)
なお、集計結果は実行環境により異なります。
Written on November 17, 2022