シェル芸160本ノック解答例 その1
技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。
- 解答例の範囲: 問題1〜問題10
問題1
$ grep '\.exe$' files.txt
test.exe
画面仕様書.xls.exe
問題2
$ ls *.png | sed -E 's/(.*)\.png/convert \1.png \1.jpg/' | sh
# `ls`を利用しない別解
$ mogrify -format jpg *.png
処理時間はそれぞれ次の通りです。
$ time ls *.png | sed -E 's/(.*)\.png/convert \1.png \1.jpg/' | sh
real 0m7.038s
user 0m5.092s
sys 0m1.629s
# `ls`を利用しない別解
$ time mogrify -format jpg *.png
real 0m5.989s
user 0m4.597s
sys 0m1.174s
問題3
# 時間節約のため、`ls -U`でソートなしでファイル名を取得
$ ls -U | sed -E 'h;s/.*/000000&/;s/.*(.{7})$/\1/;H;x' | xargs -n2 -P2 mv 2>/dev/null
# 確認
$ ls | head
0000001
0000002
0000003
0000004
0000005
0000006
0000007
0000008
0000009
0000010
$ ls | tail
0999991
0999992
0999993
0999994
0999995
0999996
0999997
0999998
0999999
1000000
問題4
# ここではファイル`2040`が該当
$ grep -r '^10$' .
./2040:10
# 該当するファイルを削除(解答例)
$ grep -lr '^10$' . | xargs rm
# 確認
$ cat 2040
cat: 2040: そのようなファイルやディレクトリはありません
問題5
$ cat ntp.conf | awk '$1=="pool"{print $2}'
0.debian.pool.ntp.org
1.debian.pool.ntp.org
2.debian.pool.ntp.org
3.debian.pool.ntp.org
なお、抽出されるサーバ名は実行環境により異なります。
問題6
$ perl -E 'for($i=4;$i>=0;$i--){say " "x$i.x}'
x
x
x
x
x
問題7
$ awk '{sum+=($1<20191001||$2~/^\*/)?int($3*1.08):int($3*1.1)}END{print sum}' kakeibo.txt
53612
問題8
$ awk -F: '$(NF-2)<12{am+=1}$(NF-2)>=12{pm+=1}END{printf "午前:%d\n午後:%d\n",am,pm}' access.log
午前:2
午後:3
問題9
$ sed '/24\/Dec\/2016 21:/,/25\/Dec\/2016 03:/!d' log_range.log
192.168.77.248 - - [24/Dec/2016 21:12:20] "GET / HTTP/1.0" 200 4294
192.168.152.143 - - [24/Dec/2016 22:06:19] "GET / HTTP/1.0" 200 7255
192.168.6.132 - - [24/Dec/2016 23:00:42] "GET / HTTP/1.0" 200 4298
192.168.222.3 - - [25/Dec/2016 00:03:23] "GET / HTTP/1.0" 200 8547
192.168.101.95 - - [25/Dec/2016 01:01:40] "GET / HTTP/1.0" 200 8488
192.168.141.18 - - [25/Dec/2016 02:15:52] "GET / HTTP/1.0" 200 4533
192.168.110.169 - - [25/Dec/2016 03:06:54] "GET / HTTP/1.0" 200 3461
問題10
$ sed -E 's/^# (.*)/\1\n===/;s/^## (.*)/\1\n---/' headings.md
AAA
===
これはAAAです
BBB
===
これはBBBです。
楽しいですね。
CCC
---
これはCCCCです
DDD
---
これはDDDです
Written on October 12, 2022