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

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


問題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