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

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


問題111

$ cat /proc/loadavg | awk '{print $1,$2,$3}'
0.05 0.57 0.56

なお、表示されているロードアベレージは一例です。


問題112

# Bashのビルトインコマンドとシステム中のファイルのみを使用した解答例
$ read -N41 c </proc/driver/rtc; t=${c#*:}; echo ${c##*:} ${t%r*}
2022-11-19 02:14:00

なお、表示されている日付と時刻は一例です。


問題113

# 準備: `sleep`コマンドのプロセスIDを取得
$ ./random_cwd.bash
pid:6201

# 解答例のワンライナーを実行し、`sleep`が実行されたディレクトリを調査
$ sed -Ez '/^PWD=/!d;s/PWD=//;s/$/\n/' /proc/6201/environ
/etc/gufw/app_profiles

# 別解
$ ls -l /proc/6201/cwd | awk '{print $NF}'
/etc/gufw/app_profiles

なお、表示されているプロセスIDとカレントディレクトリ名は一例です。


問題114

# 準備: `tail`をバックグラウンドで実行し、プロセスIDを表示
$ tail -f /dev/null &
[1] 3756

# 解答例のワンライナーを実行し、当該プロセスが参照している共有ライブラリを検索
$ awk '/\.so$/{print $NF}' /proc/3756/maps | sort -u
/lib/i386-linux-gnu/ld-2.31.so
/lib/i386-linux-gnu/libc-2.31.so

# 片付け: 当該プロセスを終了
$ kill 3756
[1]+  Terminated              tail -f /dev/null

なお、表示されているプロセスIDとファイル名は一例です。


問題115

# 1.1. マウント用の解答例
$ lsblk -o UUID,FSTYPE,PATH,MOUNTPOINT | awk -v u=$USER '$2=="vfat"&&NF==3&&$NF~/sd[c-z][0-9]+$/{printf "sudo mkdir -p /media/%s/%s && sudo mount -t %s %s /media/%s/%s\n",u,$1,$2,$3,u,$1}' | sh -v
sudo mkdir -p /media/mitsuhisa/0C59-05B8 && sudo mount -t vfat /dev/sdc1 /media/mitsuhisa/0C59-05B8

# 1.2. マウントできているか確認
$ df | grep '/dev/sd[c-z][0-9]\+'
/dev/sdc1         30203008 15254416  14948592   51% /media/mitsuhisa/0C59-05B8

# 2.1. アンマウント用の解答例
$ lsblk -o UUID,FSTYPE,MOUNTPOINT,PATH | awk -v u=$USER '$2=="vfat"&&NF==4&&$NF~/sd[c-z][0-9]+$/{printf "sudo umount /media/%s/%s && sudo rmdir /media/%s/%s\n",u,$1,u,$1}' | sh -v
sudo umount /media/mitsuhisa/0C59-05B8 && sudo rmdir /media/mitsuhisa/0C59-05B8

# 2.2. アンマウントできているか確認(出力なし)
$ df | grep '/dev/sd[c-z][0-9]\+'

なお、マウント時、アンマウント時を問わず、表示されているユーザー名とUSBメモリのUID(unique identifier)は一例です。


問題116

# 1. `/dev`下の情報を使った解答例
$ ls -l /dev | awk '/^b/{print $NF,$5$6}'
sda 8,0
sda1 8,1
sda2 8,2
sda5 8,5
sdb 8,16
sr0 11,0

# 2. `/sys`下の情報を使った解答例
$ ls -l /sys/dev/block | awk 'NR>1{sub(/.+\//,"",$NF);print $NF,$9}' | sort
sda 8:0
sda1 8:1
sda2 8:2
sda5 8:5
sdb 8:16
sr0 11:0

なお、調査結果は実行環境により異なります。


問題117

$ d(){ ls /sys/bus/usb/devices | wc -l; }; p=$(d); while :; do sleep 1; c=$(d); [ $c -lt $p ] && echo 抜かれました; [ $c -gt $p ] && echo 挿されました; p=$c; done
挿されました
抜かれました
挿されました
(...略...)

問題118

# 準備
$ ./hidoi.bash
13686

# 別の端末で解答例のワンライナーを実行
$ lsof -c hidoi.bash | awk '$4=="1w"{print $NF}'
/home/mitsuhisa/shellgei160/qdata/118/13686
/tmp/tmp.sTp17m0kDx
/home/mitsuhisa/shellgei160/qdata/118/1669018860.266517716

なお、表示されているファイル名は一例です。


問題119

$ for d in /sys/firmware/memmap/*; do printf '%016x-%016x %s\n' $(<$d/start) $(($(<$d/end)+1)) "$(<$d/type)"; done
0000000000000000-000000000009f800 System RAM
000000000009f800-00000000000a0000 Reserved
00000000ff000000-0000000100000000 Reserved
00000000000dc000-0000000000100000 Reserved
0000000000100000-000000007f6e0000 System RAM
000000007f6e0000-000000007f6ea000 ACPI Tables
000000007f6ea000-000000007f700000 ACPI Non-volatile Storage
000000007f700000-0000000080000000 Reserved
00000000f8000000-00000000fc000000 Reserved
00000000fec00000-00000000fed90000 Reserved
00000000fee00000-00000000fee01000 Reserved

なお、表示されるメモリマップは実行環境により異なります。


問題120

$ i=fd.img; d=/mnt/enigma; base64 -d enigma | gunzip > $i && sudo mkdir $d && sudo mount -o loop -t msdos $i $d && ls $d && sudo umount $d && sudo rmdir $d && rm -f $i
software
Written on November 21, 2022